diff options
| author | Nathan Sidwell <nathan@gcc.gnu.org> | 2003-12-16 10:03:54 +0000 |
|---|---|---|
| committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2003-12-16 10:03:54 +0000 |
| commit | 0f30f285e44b335cef60431f418bda986f47df35 (patch) | |
| tree | d619ba37e2f11c11c81e8d947feaa51ba9c8ef6c /gcc/cp/mangle.c | |
| parent | a689d4e0ea6a94acd0cb585462f7f57f7c05be7c (diff) | |
| download | gcc-0f30f285e44b335cef60431f418bda986f47df35.zip gcc-0f30f285e44b335cef60431f418bda986f47df35.tar.gz gcc-0f30f285e44b335cef60431f418bda986f47df35.tar.bz2 | |
re PR c++/13242 ([ABI] Incorrect mangling of template reference parameters)
cp:
PR c++/13242
C++ ABI change. Mangling template parameters of reference type
* mangle.c (write_template_args): Remove unreachable code.
(write_template_arg): Look through an argument of reference type.
testsuite:
PR c++/13242
* g++.dg/abi/mangle19-1.C: New test.
* g++.dg/abi/mangle19-2.C: New test.
From-SVN: r74682
Diffstat (limited to 'gcc/cp/mangle.c')
| -rw-r--r-- | gcc/cp/mangle.c | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index a20757e..fe01120 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1845,37 +1845,25 @@ write_class_enum_type (const tree type) static void write_template_args (tree args) { + int i; + int length = TREE_VEC_LENGTH (args); + MANGLE_TRACE_TREE ("template-args", args); write_char ('I'); - if (TREE_CODE (args) == TREE_VEC) - { - int i; - int length = TREE_VEC_LENGTH (args); - my_friendly_assert (length > 0, 20000422); + my_friendly_assert (length > 0, 20000422); - if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC) - { - /* We have nested template args. We want the innermost template - argument list. */ - args = TREE_VEC_ELT (args, length - 1); - length = TREE_VEC_LENGTH (args); - } - for (i = 0; i < length; ++i) - write_template_arg (TREE_VEC_ELT (args, i)); - } - else + if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC) { - my_friendly_assert (TREE_CODE (args) == TREE_LIST, 20021014); - - while (args) - { - write_template_arg (TREE_VALUE (args)); - args = TREE_CHAIN (args); - } + /* We have nested template args. We want the innermost template + argument list. */ + args = TREE_VEC_ELT (args, length - 1); + length = TREE_VEC_LENGTH (args); } - + for (i = 0; i < length; ++i) + write_template_arg (TREE_VEC_ELT (args, i)); + write_char ('E'); } @@ -2165,6 +2153,20 @@ write_template_arg (tree node) code = TREE_CODE (node); } } + + if (TREE_CODE (node) == NOP_EXPR + && TREE_CODE (TREE_TYPE (node)) == REFERENCE_TYPE) + { + /* Template parameters can be of reference type. To maintain + internal consistency, such arguments use a conversion from + address of object to reference type. */ + my_friendly_assert (TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR, + 20031215); + if (abi_version_at_least (2)) + node = TREE_OPERAND (TREE_OPERAND (node, 0), 0); + else + G.need_abi_warning = 1; + } if (TYPE_P (node)) write_type (node); |
