c++: Local class DMI using local static [PR90479]
authorJason Merrill <jason@redhat.com>
Fri, 1 May 2020 17:53:32 +0000 (13:53 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 1 May 2020 17:53:34 +0000 (13:53 -0400)
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.

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/g++.dg/cpp0x/nsdmi-template20.C [new file with mode: 0644]

index 44686909c8340f1a999f6970007d838de9ab7ab4..0675f9826773a53cf3ded81605aa681ef35cd2ec 100644 (file)
@@ -1,3 +1,8 @@
+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
index ea95a3bc91035e4f297a32020ec7f64bd86d52d3..c7ae9404e0486f12e4aed10b92526b86bab30ea0 100644 (file)
@@ -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);
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template20.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template20.C
new file mode 100644 (file)
index 0000000..06448d9
--- /dev/null
@@ -0,0 +1,13 @@
+// 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> ();
+}