Commit c79e664b by Jason Merrill

c++: Local class DMI using local static [PR90749]

For default member initializers in templates it's important to push into the
right context during get_nsdmi.  But for a local class that's not possible,
and trying leaves the function context we need to be in, so don't try.

gcc/cp/ChangeLog
2020-05-01  Jason Merrill  <jason@redhat.com>

	PR c++/90479
	* init.c (get_nsdmi): Don't push_to_top_level for a local class.
parent 01ff88c5
2020-05-25 Jason Merrill <jason@redhat.com>
PR c++/90479
* init.c (get_nsdmi): Don't push_to_top_level for a local class.
2020-05-25 Jason Merrill <jason@redhat.com>
PR c++/91529
* decl.c (cp_finish_decl): Also clear TREE_READONLY if
-fmerge-all-constants.
......
......@@ -585,16 +585,18 @@ get_nsdmi (tree member, bool in_ctor, tsubst_flags_t complain)
DECL_INSTANTIATING_NSDMI_P (member) = 1;
bool pushed = false;
if (!currently_open_class (DECL_CONTEXT (member)))
tree ctx = DECL_CONTEXT (member);
if (!currently_open_class (ctx)
&& !LOCAL_CLASS_P (ctx))
{
push_to_top_level ();
push_nested_class (DECL_CONTEXT (member));
push_nested_class (ctx);
pushed = true;
}
gcc_checking_assert (!processing_template_decl);
inject_this_parameter (DECL_CONTEXT (member), TYPE_UNQUALIFIED);
inject_this_parameter (ctx, TYPE_UNQUALIFIED);
start_lambda_scope (member);
......
// PR c++/90479
// { dg-do compile { target c++11 } }
template <int n>
void foo ()
{
static int i {100};
struct { int a {i++}; } b {};
}
int main ()
{
foo<0> ();
}
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