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.

Tested x86_64-pc-linux-gnu, applying to trunk.

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

        PR c++/90479
        * init.c (get_nsdmi): Don't push_to_top_level for a local class.
---
 gcc/cp/init.c                                 |  8 +++++---
 gcc/testsuite/g++.dg/cpp0x/nsdmi-template20.C | 13 +++++++++++++
 2 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-template20.C

diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index ea95a3bc910..c7ae9404e04 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -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
index 00000000000..06448d92f12
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template20.C
@@ -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> ();
+}

base-commit: afb9b7108104a73e8ac7a9b8e6875870e5ca4bbb
-- 
2.18.1

Reply via email to