diff options
author | Jason Merrill <jason@redhat.com> | 2009-03-31 12:52:21 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-03-31 12:52:21 -0400 |
commit | a3c497526740202a565d78c77d29f2b93c92f1ee (patch) | |
tree | 65cbe883016e0f43c2ff2bd91f18a79232e45c62 /gcc/cp | |
parent | d236ace7cb1bd6fc810a9e80d2ac6c0e794dc29c (diff) | |
download | gcc-a3c497526740202a565d78c77d29f2b93c92f1ee.zip gcc-a3c497526740202a565d78c77d29f2b93c92f1ee.tar.gz gcc-a3c497526740202a565d78c77d29f2b93c92f1ee.tar.bz2 |
mangle.c (write_expression): Mangle dependent name as source-name.
* mangle.c (write_expression): Mangle dependent name as
source-name.
From-SVN: r145364
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 26 |
2 files changed, 23 insertions, 8 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'); |