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
This commit is contained in:
parent
d9fac9dd59
commit
ce9011004c
@ -1,5 +1,9 @@
|
||||
2013-07-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
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'.
|
||||
|
@ -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
|
||||
|
19
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C
Normal file
19
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C
Normal file
@ -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 >;
|
Loading…
Reference in New Issue
Block a user