From: Jason Merrill Date: Tue, 9 Jul 2013 18:50:28 +0000 (-0400) Subject: re PR c++/57658 (ICE in tsubst_copy, at cp/pt.c:12213) X-Git-Tag: releases/gcc-4.9.0~5057 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ce9011004c1a2cdbfd6bb2b7e0003f73a3f21d69;p=thirdparty%2Fgcc.git re PR c++/57658 (ICE in tsubst_copy, at cp/pt.c:12213) PR c++/57658 * semantics.c (finish_id_expression): Return the id for an unevaluated outer variable. From-SVN: r200845 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9770f5b38c7b..88ba7696732d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-07-09 Jason Merrill + PR c++/57658 + * semantics.c (finish_id_expression): Return the id for an + unevaluated outer variable. + PR c++/57526 * semantics.c (lambda_capture_field_type): Build a DECLTYPE_TYPE if the variable type uses 'auto'. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fd6c81911917..74a6a53dc447 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3056,15 +3056,15 @@ finish_id_expression (tree id_expression, /* Disallow uses of local variables from containing functions, except within lambda-expressions. */ - if (!outer_var_p (decl) - /* It's not a use (3.2) if we're in an unevaluated context. */ - || cp_unevaluated_operand) - /* OK. */; - else if (TREE_STATIC (decl)) + if (!outer_var_p (decl)) + /* OK */; + else if (TREE_STATIC (decl) + /* It's not a use (3.2) if we're in an unevaluated context. */ + || cp_unevaluated_operand) { if (processing_template_decl) - /* For a use of an outer static var, return the identifier so - that we'll look it up again in the instantiation. */ + /* For a use of an outer static/unevaluated var, return the id + so that we'll look it up again in the instantiation. */ return id_expression; } else diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C new file mode 100644 index 000000000000..635af97d763c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C @@ -0,0 +1,19 @@ +// PR c++/57568 +// { dg-require-effective-target c++11 } + +template < class T > +struct remove_reference +{ typedef int type; }; +template < class T > +class X +{ + enum Q { }; + bool f () + { + Q a; + [&a]{ + typename remove_reference < decltype (a) >::type t; + }; + } +}; +template class X< int >;