]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/58761 (ICE with a lambda capturing this in a NSDMI)
authorJason Merrill <jason@redhat.com>
Mon, 19 May 2014 18:41:24 +0000 (14:41 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 19 May 2014 18:41:24 +0000 (14:41 -0400)
PR c++/58761
* pt.c (tsubst_copy): Don't check at_function_scope_p.
(instantiate_class_template_1): Don't push_to_top_level in an nsdmi.

From-SVN: r210624

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi6.C [new file with mode: 0644]

index 1b0916cdedb467bdd4956e7f6574df0417c04af3..822f79be33c113f7e6980825adf22241299d1cc6 100644 (file)
@@ -1,3 +1,9 @@
+2014-05-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/58761
+       * pt.c (tsubst_copy): Don't check at_function_scope_p.
+       (instantiate_class_template_1): Don't push_to_top_level in an nsdmi.
+
 2014-05-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * typeck2.c (cxx_incomplete_type_diagnostic): Use inform.
index c9eddb8b1c10b70f4138343332f843bc4758fb66..d712583931906fc89cf16f8503f3202d11bc6dfa 100644 (file)
@@ -8942,6 +8942,9 @@ instantiate_class_template_1 (tree type)
   push_deferring_access_checks (dk_no_deferred);
 
   fn_context = decl_function_context (TYPE_MAIN_DECL (type));
+  /* Also avoid push_to_top_level for a lambda in an NSDMI.  */
+  if (!fn_context && LAMBDA_TYPE_P (type) && TYPE_CLASS_SCOPE_P (type))
+    fn_context = error_mark_node;
   if (!fn_context)
     push_to_top_level ();
   /* Use #pragma pack from the template context.  */
@@ -12531,7 +12534,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
        {
          /* We get here for a use of 'this' in an NSDMI.  */
          if (DECL_NAME (t) == this_identifier
-             && at_function_scope_p ()
+             && current_function_decl
              && DECL_CONSTRUCTOR_P (current_function_decl))
            return current_class_ptr;
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi6.C
new file mode 100644 (file)
index 0000000..98cdbce
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/58761
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct X
+{
+  int x = 42;
+  int y = [this](){return this->x;}();
+};
+
+template <class T>
+struct Y
+{
+  int x = 42;
+  int y = [this](){return this->x;}();
+  Y(int) {}
+};
+
+int main()
+{
+  X<int> x;
+  Y<int> y(42);
+}