Commit cdf47df0 by Jason Merrill Committed by Jason Merrill

re PR c++/55240 ([c++0x] ICE on non-static data member initialization using…

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
parent a1e03bc5
2013-03-16 Jason Merrill <jason@redhat.com> 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 PR c++/55241
* error.c (dump_expr) [SIZEOF_EXPR]: Print sizeof... properly. * error.c (dump_expr) [SIZEOF_EXPR]: Print sizeof... properly.
......
...@@ -4259,6 +4259,7 @@ extern int comparing_specializations; ...@@ -4259,6 +4259,7 @@ extern int comparing_specializations;
extern int cp_unevaluated_operand; extern int cp_unevaluated_operand;
extern tree cp_convert_range_for (tree, tree, tree); extern tree cp_convert_range_for (tree, tree, tree);
extern bool parsing_nsdmi (void);
/* in pt.c */ /* in pt.c */
......
...@@ -16938,6 +16938,19 @@ inject_this_parameter (tree ctype, cp_cv_quals quals) ...@@ -16938,6 +16938,19 @@ inject_this_parameter (tree ctype, cp_cv_quals quals)
current_class_ptr = this_parm; 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 /* Parse a late-specified return type, if any. This is not a separate
non-terminal, but part of a function declarator, which looks like non-terminal, but part of a function declarator, which looks like
......
...@@ -2884,7 +2884,8 @@ outer_var_p (tree decl) ...@@ -2884,7 +2884,8 @@ outer_var_p (tree decl)
{ {
return ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL) return ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
&& DECL_FUNCTION_SCOPE_P (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. */ /* As above, but also checks that DECL is automatic. */
...@@ -3041,12 +3042,14 @@ finish_id_expression (tree id_expression, ...@@ -3041,12 +3042,14 @@ finish_id_expression (tree id_expression,
return integral_constant_value (decl); 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 /* If we are in a lambda function, we can move out until we hit
1. the context, 1. the context,
2. a non-lambda function, or 2. a non-lambda function, or
3. a non-default capturing lambda function. */ 3. a non-default capturing lambda function. */
while (context != containing_function else while (context != containing_function
&& LAMBDA_FUNCTION_P (containing_function)) && LAMBDA_FUNCTION_P (containing_function))
{ {
lambda_expr = CLASSTYPE_LAMBDA_EXPR lambda_expr = CLASSTYPE_LAMBDA_EXPR
(DECL_CONTEXT (containing_function)); (DECL_CONTEXT (containing_function));
......
// 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" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment