From: Jason Merrill Date: Tue, 13 May 2014 17:54:00 +0000 (-0400) Subject: re PR c++/61151 (ICE with lambda) X-Git-Tag: releases/gcc-5.1.0~7603 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6626c52e1a6af7b32200ec1bf22fc790e5717480;p=thirdparty%2Fgcc.git re PR c++/61151 (ICE with lambda) PR c++/61151 * semantics.c (is_this_parameter): Allow capture proxies too. From-SVN: r210394 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ca0752747d50..a26472c333f9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-05-13 Jason Merrill + + PR c++/61151 + * semantics.c (is_this_parameter): Allow capture proxies too. + 2014-05-12 Jason Merrill * call.c (maybe_print_user_conv_context): New. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d925f5ced40e..583b87048a96 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8158,8 +8158,10 @@ maybe_initialize_constexpr_call_table (void) bool is_this_parameter (tree t) { - return (TREE_CODE (t) == PARM_DECL - && DECL_NAME (t) == this_identifier); + if (!DECL_P (t) || DECL_NAME (t) != this_identifier) + return false; + gcc_assert (TREE_CODE (t) == PARM_DECL || is_capture_proxy (t)); + return true; } /* We have an expression tree T that represents a call, either CALL_EXPR diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C new file mode 100644 index 000000000000..fec2da615b67 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C @@ -0,0 +1,30 @@ +// PR c++/61151 +// { dg-do compile { target c++11 } } + +struct B +{ + void foo () {} +}; + +template +struct A +{ + template void bar (); + B a; +}; + +template +template +void +A::bar () +{ + auto f = [this] () { auto g = [=] () { a.foo (); }; g (); }; + f (); +} + +int +main () +{ + A a; + a.bar (); +}