Commit 637f68e8 by Jason Merrill Committed by Jason Merrill

pt.c (tsubst_expr): Instantiate local class.

	* pt.c (tsubst_expr) [TAG_DEFN]: Instantiate local class.
	* class.c (finish_struct): Don't add a TAG_DEFN for a lambda.
	* decl2.c (finish_static_data_member_decl): Avoid redundant error.

From-SVN: r188474
parent fdaf2f48
2012-06-09 Jason Merrill <jason@redhat.com> 2012-06-09 Jason Merrill <jason@redhat.com>
* pt.c (tsubst_expr) [TAG_DEFN]: Instantiate local class.
* class.c (finish_struct): Don't add a TAG_DEFN for a lambda.
* decl2.c (finish_static_data_member_decl): Avoid redundant error.
PR c++/53599 PR c++/53599
* name-lookup.c (pushtag_1): Add a DECL_EXPR for a local class. * name-lookup.c (pushtag_1): Add a DECL_EXPR for a local class.
* semantics.c (finish_cond): Build a COMPOUND_EXPR. * semantics.c (finish_cond): Build a COMPOUND_EXPR.
......
...@@ -6337,7 +6337,9 @@ finish_struct (tree t, tree attributes) ...@@ -6337,7 +6337,9 @@ finish_struct (tree t, tree attributes)
else else
error ("trying to finish struct, but kicked out due to previous parse errors"); error ("trying to finish struct, but kicked out due to previous parse errors");
if (processing_template_decl && at_function_scope_p ()) if (processing_template_decl && at_function_scope_p ()
/* Lambdas are defined by the LAMBDA_EXPR. */
&& !LAMBDA_TYPE_P (t))
add_stmt (build_min (TAG_DEFN, t)); add_stmt (build_min (TAG_DEFN, t));
return t; return t;
......
...@@ -770,7 +770,9 @@ finish_static_data_member_decl (tree decl, ...@@ -770,7 +770,9 @@ finish_static_data_member_decl (tree decl,
if (! processing_template_decl) if (! processing_template_decl)
VEC_safe_push (tree, gc, pending_statics, decl); VEC_safe_push (tree, gc, pending_statics, decl);
if (LOCAL_CLASS_P (current_class_type)) if (LOCAL_CLASS_P (current_class_type)
/* We already complained about the template definition. */
&& !DECL_TEMPLATE_INSTANTIATION (decl))
permerror (input_location, "local class %q#T shall not have static data member %q#D", permerror (input_location, "local class %q#T shall not have static data member %q#D",
current_class_type, decl); current_class_type, decl);
......
...@@ -13123,7 +13123,21 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, ...@@ -13123,7 +13123,21 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
break; break;
case TAG_DEFN: case TAG_DEFN:
tsubst (TREE_TYPE (t), args, complain, NULL_TREE); tmp = tsubst (TREE_TYPE (t), args, complain, NULL_TREE);
if (CLASS_TYPE_P (tmp))
{
/* Local classes are not independent templates; they are
instantiated along with their containing function. And this
way we don't have to deal with pushing out of one local class
to instantiate a member of another local class. */
tree fn;
/* Closures are handled by the LAMBDA_EXPR. */
gcc_assert (!LAMBDA_TYPE_P (TREE_TYPE (t)));
complete_type (tmp);
for (fn = TYPE_METHODS (tmp); fn; fn = DECL_CHAIN (fn))
if (!DECL_ARTIFICIAL (fn))
instantiate_decl (fn, /*defer_ok*/0, /*expl_inst_class*/false);
}
break; break;
case STATIC_ASSERT: case STATIC_ASSERT:
......
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