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.
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.
+
+2020-05-01 Jason Merrill <jason@redhat.com>
+
PR c++/91529
* decl.c (cp_finish_decl): Also clear TREE_READONLY if
-fmerge-all-constants.
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);
--- /dev/null
+// 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> ();
+}