diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 66ac60edd4b..033a8f13628 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,4 +1,7 @@ -2009-03-30 Jason Merrill +2009-03-31 Jason Merrill + + * mangle.c (write_expression): Mangle dependent name as + source-name. PR c++/38030, 38850, 39070 * pt.c (type_dependent_expression_p_push): New fn. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index eabab7fb510..5f2ace0cbb1 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2159,12 +2159,6 @@ write_expression (tree expr) code = TREE_CODE (expr); } - if (code == OVERLOAD) - { - expr = OVL_FUNCTION (expr); - code = TREE_CODE (expr); - } - /* Handle pointers-to-members by making them look like expression nodes. */ if (code == PTRMEM_CST) @@ -2344,7 +2338,25 @@ write_expression (tree expr) switch (code) { case CALL_EXPR: - write_expression (CALL_EXPR_FN (expr)); + { + tree fn = CALL_EXPR_FN (expr); + + if (TREE_CODE (fn) == ADDR_EXPR) + fn = TREE_OPERAND (fn, 0); + + /* Mangle a dependent name as the name, not whatever happens to + be the first function in the overload set. */ + if ((TREE_CODE (fn) == FUNCTION_DECL + || TREE_CODE (fn) == OVERLOAD) + && type_dependent_expression_p_push (expr)) + fn = DECL_NAME (get_first_fn (fn)); + + if (TREE_CODE (fn) == IDENTIFIER_NODE) + write_source_name (fn); + else + write_expression (fn); + } + for (i = 0; i < call_expr_nargs (expr); ++i) write_expression (CALL_EXPR_ARG (expr, i)); write_char ('E'); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19cf3d6691d..43ae63df6bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-03-31 Jason Merrill + + * g++.dg/cpp0x/auto6.C: Adjust expected mangling. + * g++.dg/cpp0x/auto12.C: Likewise. + 2009-03-31 Richard Guenther PR middle-end/31029 diff --git a/gcc/testsuite/g++.dg/cpp0x/auto12.C b/gcc/testsuite/g++.dg/cpp0x/auto12.C index 34dc8c90b84..82d36f0d0d2 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto12.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto12.C @@ -58,6 +58,6 @@ int main() A().h(1); // { dg-final { scan-assembler "_ZN1AIiE1jIiEEDTplfp_clL_Z1xvEEET_" } } A().j(1); - // { dg-final { scan-assembler "_Z1gIIidEEDTclL_Z1fEspplfp_Li1EEEDpT_" } } + // { dg-final { scan-assembler "_Z1gIIidEEDTcl1fspplfp_Li1EEEDpT_" } } g(42, 1.0); } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto6.C b/gcc/testsuite/g++.dg/cpp0x/auto6.C index dfd6a202698..11e73d2e716 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto6.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto6.C @@ -101,7 +101,7 @@ int main() auto i4 = add4(1, 2.0); // { dg-final { scan-assembler "_Z4add2IidEDTplcvT__EcvT0__EES0_S1_" } } auto i2 = add2(1, 2.0); - // { dg-final { scan-assembler "_Z4add3IidEDTclL_Z2agEfp_fp0_EET_T0_" } } + // { dg-final { scan-assembler "_Z4add3IidEDTcl2agfp_fp0_EET_T0_" } } auto i3 = add3(1, 2.0); // { dg-final { scan-assembler "_Z1fI1AIiEEDTclptfp_1fEEPT_" } } f(p);