aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/mangle.c26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/auto12.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/auto6.C2
5 files changed, 30 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 66ac60e..033a8f1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,4 +1,7 @@
-2009-03-30 Jason Merrill <jason@redhat.com>
+2009-03-31 Jason Merrill <jason@redhat.com>
+
+ * 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 eabab7f..5f2ace0 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 19cf3d6..43ae63d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-31 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/auto6.C: Adjust expected mangling.
+ * g++.dg/cpp0x/auto12.C: Likewise.
+
2009-03-31 Richard Guenther <rguenther@suse.de>
PR middle-end/31029
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto12.C b/gcc/testsuite/g++.dg/cpp0x/auto12.C
index 34dc8c9..82d36f0 100644
--- a/gcc/testsuite/g++.dg/cpp0x/auto12.C
+++ b/gcc/testsuite/g++.dg/cpp0x/auto12.C
@@ -58,6 +58,6 @@ int main()
A<int>().h(1);
// { dg-final { scan-assembler "_ZN1AIiE1jIiEEDTplfp_clL_Z1xvEEET_" } }
A<int>().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 dfd6a20..11e73d2 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);