diff mbox series

[pushed] c++: Local class DMI using local static [PR90479]

Message ID 20200501175851.9106-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: Local class DMI using local static [PR90479] | expand

Commit Message

Jason Merrill May 1, 2020, 5:58 p.m. UTC
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  <jason@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


base-commit: afb9b7108104a73e8ac7a9b8e6875870e5ca4bbb
diff mbox series

Patch

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> ();
+}