re PR c++/55240 ([c++0x] ICE on non-static data member initialization using 'auto' variable from containing function)
PR c++/55240 * parser.c (parsing_nsdmi): New. * semantics.c (outer_automatic_var_p): Check it. (finish_id_expression): Likewise. * cp-tree.h: Declare it. From-SVN: r196727
This commit is contained in:
parent
a1e03bc5bc
commit
cdf47df08a
|
@ -1,5 +1,11 @@
|
|||
2013-03-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/55240
|
||||
* parser.c (parsing_nsdmi): New.
|
||||
* semantics.c (outer_automatic_var_p): Check it.
|
||||
(finish_id_expression): Likewise.
|
||||
* cp-tree.h: Declare it.
|
||||
|
||||
PR c++/55241
|
||||
* error.c (dump_expr) [SIZEOF_EXPR]: Print sizeof... properly.
|
||||
|
||||
|
|
|
@ -4259,6 +4259,7 @@ extern int comparing_specializations;
|
|||
|
||||
extern int cp_unevaluated_operand;
|
||||
extern tree cp_convert_range_for (tree, tree, tree);
|
||||
extern bool parsing_nsdmi (void);
|
||||
|
||||
/* in pt.c */
|
||||
|
||||
|
|
|
@ -16938,6 +16938,19 @@ inject_this_parameter (tree ctype, cp_cv_quals quals)
|
|||
current_class_ptr = this_parm;
|
||||
}
|
||||
|
||||
/* Return true iff our current scope is a non-static data member
|
||||
initializer. */
|
||||
|
||||
bool
|
||||
parsing_nsdmi (void)
|
||||
{
|
||||
/* We recognize NSDMI context by the context-less 'this' pointer set up
|
||||
by the function above. */
|
||||
if (current_class_ptr && DECL_CONTEXT (current_class_ptr) == NULL_TREE)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Parse a late-specified return type, if any. This is not a separate
|
||||
non-terminal, but part of a function declarator, which looks like
|
||||
|
||||
|
|
|
@ -2884,7 +2884,8 @@ outer_var_p (tree decl)
|
|||
{
|
||||
return ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
|
||||
&& DECL_FUNCTION_SCOPE_P (decl)
|
||||
&& DECL_CONTEXT (decl) != current_function_decl);
|
||||
&& (DECL_CONTEXT (decl) != current_function_decl
|
||||
|| parsing_nsdmi ()));
|
||||
}
|
||||
|
||||
/* As above, but also checks that DECL is automatic. */
|
||||
|
@ -3041,12 +3042,14 @@ finish_id_expression (tree id_expression,
|
|||
return integral_constant_value (decl);
|
||||
}
|
||||
|
||||
if (parsing_nsdmi ())
|
||||
containing_function = NULL_TREE;
|
||||
/* If we are in a lambda function, we can move out until we hit
|
||||
1. the context,
|
||||
2. a non-lambda function, or
|
||||
3. a non-default capturing lambda function. */
|
||||
while (context != containing_function
|
||||
&& LAMBDA_FUNCTION_P (containing_function))
|
||||
else while (context != containing_function
|
||||
&& LAMBDA_FUNCTION_P (containing_function))
|
||||
{
|
||||
lambda_expr = CLASSTYPE_LAMBDA_EXPR
|
||||
(DECL_CONTEXT (containing_function));
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// PR c++/55240
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
int main()
|
||||
{
|
||||
int q = 1; // { dg-error "declared here" }
|
||||
struct test { int x = q; } instance; // { dg-error "local variable" }
|
||||
}
|
Loading…
Reference in New Issue