re PR c++/54538 (Getting assembler messages when compiling)
authorJason Merrill <jason@redhat.com>
Mon, 10 Sep 2012 23:51:34 +0000 (19:51 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 10 Sep 2012 23:51:34 +0000 (19:51 -0400)
PR c++/54538
PR c++/53783
* pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Go back to using RECUR
for LAMBDA_EXPR_EXTRA_SCOPE except for function scope.

From-SVN: r191164

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

index 2fd7c12..72e6c51 100644 (file)
@@ -1,5 +1,10 @@
 2012-09-10  Jason Merrill  <jason@redhat.com>
 
+       PR c++/54538
+       PR c++/53783
+       * pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Go back to using RECUR
+       for LAMBDA_EXPR_EXTRA_SCOPE except for function scope.
+
        PR c++/54506
        * decl.c (move_signature_fn_p): Split out from move_fn_p.
        * method.c (process_subob_fn): Use it.
index cde83f2..a875528 100644 (file)
@@ -14199,8 +14199,18 @@ tsubst_copy_and_build (tree t,
        LAMBDA_EXPR_MUTABLE_P (r) = LAMBDA_EXPR_MUTABLE_P (t);
        LAMBDA_EXPR_DISCRIMINATOR (r)
          = (LAMBDA_EXPR_DISCRIMINATOR (t));
-       LAMBDA_EXPR_EXTRA_SCOPE (r)
-         = tsubst (LAMBDA_EXPR_EXTRA_SCOPE (t), args, complain, in_decl);
+       /* For a function scope, we want to use tsubst so that we don't
+          complain about referring to an auto function before its return
+          type has been deduced.  Otherwise, we want to use tsubst_copy so
+          that we look up the existing field/parameter/variable rather
+          than build a new one.  */
+       tree scope = LAMBDA_EXPR_EXTRA_SCOPE (t);
+       if (scope && TREE_CODE (scope) == FUNCTION_DECL)
+         scope = tsubst (LAMBDA_EXPR_EXTRA_SCOPE (t), args,
+                         complain, in_decl);
+       else
+         scope = RECUR (scope);
+       LAMBDA_EXPR_EXTRA_SCOPE (r) = scope;
        LAMBDA_EXPR_RETURN_TYPE (r)
          = tsubst (LAMBDA_EXPR_RETURN_TYPE (t), args, complain, in_decl);
 
index 1f8edec..bd14780 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/54538
+       * g++.dg/cpp0x/lambda/lambda-mangle4.C: New.
+
 2012-09-10  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/54089
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C
new file mode 100644 (file)
index 0000000..0d37637
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/54538
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+  // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_cvPFvvEEv" } }
+  // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_cvPFvvEEv" } }
+  void (*p)() = []{};
+};
+
+A<int> a1;
+A<char> a2;