diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ab9c0df5312..ed0aeeb6d44 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2009-12-21 Jason Merrill + + * mangle.c (write_member_name): Move abi-version=1 code back to... + (write_expression): ...here. + 2009-12-21 Brian Hackett * decl.c (finish_function): Rename pre-genericize event. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index d673c6ea8b3..13b0ed47af3 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2299,12 +2299,7 @@ write_member_name (tree member) if (TREE_CODE (member) == IDENTIFIER_NODE) write_source_name (member); else if (DECL_P (member)) - { - /* G++ 3.2 incorrectly put out both the "sr" code and - the nested name of the qualified name. */ - G.need_abi_warning = 1; - write_unqualified_name (member); - } + write_unqualified_name (member); else if (TREE_CODE (member) == TEMPLATE_ID_EXPR) { tree name = TREE_OPERAND (member, 0); @@ -2401,17 +2396,27 @@ write_expression (tree expr) write_string ("at"); write_type (TREE_OPERAND (expr, 0)); } - else if (abi_version_at_least (2) && TREE_CODE (expr) == SCOPE_REF) + else if (TREE_CODE (expr) == SCOPE_REF) { tree scope = TREE_OPERAND (expr, 0); tree member = TREE_OPERAND (expr, 1); + if (!abi_version_at_least (2)) + { + write_string ("sr"); + write_type (scope); + /* G++ 3.2 incorrectly put out both the "sr" code and + the nested name of the qualified name. */ + G.need_abi_warning = 1; + write_encoding (member); + } + /* If the MEMBER is a real declaration, then the qualifying scope was not dependent. Ideally, we would not have a SCOPE_REF in those cases, but sometimes we do. If the second argument is a DECL, then the name must not have been dependent. */ - if (DECL_P (member)) + else if (DECL_P (member)) write_expression (member); else { @@ -2576,12 +2581,6 @@ write_expression (tree expr) sorry ("mangling new-expression"); break; - /* Handle pointers-to-members specially. */ - case SCOPE_REF: - write_type (TREE_OPERAND (expr, 0)); - write_member_name (TREE_OPERAND (expr, 1)); - break; - default: for (i = 0; i < TREE_OPERAND_LENGTH (expr); ++i) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b31b4a1c959..0245226d008 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-12-21 Jason Merrill + + * g++.dg/abi/mangle14.C: Add expected mangling. + 2009-12-21 Andy Hutchinson * gcc.dg/pr36901.h: AVR must support address zero. diff --git a/gcc/testsuite/g++.dg/abi/mangle14.C b/gcc/testsuite/g++.dg/abi/mangle14.C index 1205ac45fe0..2b38255ac0a 100644 --- a/gcc/testsuite/g++.dg/abi/mangle14.C +++ b/gcc/testsuite/g++.dg/abi/mangle14.C @@ -1,5 +1,6 @@ // { dg-do compile } // { dg-options "-Wabi -fabi-version=1" } +// { dg-final { scan-assembler "_Z1g1SIXadsr1ANS0_1fIiEEivEE" } } struct A { template int f ();