aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/mangle.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@gcc.gnu.org>2003-12-16 10:03:54 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2003-12-16 10:03:54 +0000
commit0f30f285e44b335cef60431f418bda986f47df35 (patch)
treed619ba37e2f11c11c81e8d947feaa51ba9c8ef6c /gcc/cp/mangle.c
parenta689d4e0ea6a94acd0cb585462f7f57f7c05be7c (diff)
downloadgcc-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.c50
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);