From b34e0e6fc844922bcd84583fc8dbaa0669afa5c0 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 11 Jan 2012 15:26:44 -0500 Subject: re PR c++/51818 ([C++0x] Name mangling error using lambda expressions in GCC47) PR c++/51818 * mangle.c (find_substitution): A type is only a substitution match if we're looking for a type. (write_nested_name): Use decl_mangling_context. From-SVN: r183107 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/mangle.c | 4 ++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8893880..6850778 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2012-01-11 Jason Merrill + PR c++/51818 + * mangle.c (find_substitution): A type is only a substitution + match if we're looking for a type. + (write_nested_name): Use decl_mangling_context. + * decl.c (decls_match): Assert that the arguments are decls. PR c++/51613 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index f4efa67..60b1870 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -615,7 +615,7 @@ find_substitution (tree node) /* NODE is a matched to a candidate if it's the same decl node or if it's the same type. */ if (decl == candidate - || (TYPE_P (candidate) && type && TYPE_P (type) + || (TYPE_P (candidate) && type && TYPE_P (node) && same_type_p (type, candidate)) || NESTED_TEMPLATE_MATCH (node, candidate)) { @@ -949,7 +949,7 @@ write_nested_name (const tree decl) else { /* No, just use */ - write_prefix (CP_DECL_CONTEXT (decl)); + write_prefix (decl_mangling_context (decl)); write_unqualified_name (decl); } write_char ('E'); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f49cdd9..0d5b596 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-11 Jason Merrill + + PR c++/51818 + * g++.dg/cpp0x/lambda/lambda-mangle3.C: New. + 2012-01-11 Eric Botcazou * gnat.dg/array19.ad[sb]: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C new file mode 100644 index 0000000..06913a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C @@ -0,0 +1,15 @@ +// PR c++/51818 +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1AC1IN3foo3barMUlvE_EEET_" } } + +struct A +{ + template A(T) { } +}; + +struct foo +{ + A bar = []{}; +}; + +foo f; -- cgit v1.1