re PR c++/54538 (Getting assembler messages when compiling)

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
This commit is contained in:
Jason Merrill 2012-09-10 19:51:34 -04:00 committed by Jason Merrill
parent 05279bcd52
commit da4c5b2465
4 changed files with 35 additions and 2 deletions

View 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.

View 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);

View 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

View file

@ -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;