Commit 0f30f285 by Nathan Sidwell

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
parent a689d4e0
2003-12-16 Nathan Sidwell <nathan@codesourcery.com>
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.
2003-12-16 Giovanni Bajo <giovannibajo@gcc.gnu.org> 2003-12-16 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/2294 PR c++/2294
......
...@@ -1845,14 +1845,13 @@ write_class_enum_type (const tree type) ...@@ -1845,14 +1845,13 @@ write_class_enum_type (const tree type)
static void static void
write_template_args (tree args) write_template_args (tree args)
{ {
int i;
int length = TREE_VEC_LENGTH (args);
MANGLE_TRACE_TREE ("template-args", args); MANGLE_TRACE_TREE ("template-args", args);
write_char ('I'); 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) if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
...@@ -1864,17 +1863,6 @@ write_template_args (tree args) ...@@ -1864,17 +1863,6 @@ write_template_args (tree args)
} }
for (i = 0; i < length; ++i) for (i = 0; i < length; ++i)
write_template_arg (TREE_VEC_ELT (args, i)); write_template_arg (TREE_VEC_ELT (args, i));
}
else
{
my_friendly_assert (TREE_CODE (args) == TREE_LIST, 20021014);
while (args)
{
write_template_arg (TREE_VALUE (args));
args = TREE_CHAIN (args);
}
}
write_char ('E'); write_char ('E');
} }
...@@ -2166,6 +2154,20 @@ write_template_arg (tree node) ...@@ -2166,6 +2154,20 @@ write_template_arg (tree 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)) if (TYPE_P (node))
write_type (node); write_type (node);
else if (code == TEMPLATE_DECL) else if (code == TEMPLATE_DECL)
......
2003-12-16 Nathan Sidwell <nathan@codesourcery.com>
PR c++/13242
* g++.dg/abi/mangle19-1.C: New test.
* g++.dg/abi/mangle19-2.C: New test.
2003-12-16 Hartmut Penner <hpenner@de.ibm.com> 2003-12-16 Hartmut Penner <hpenner@de.ibm.com>
* testsuite/gcc.dg/altivec-10.c: Test vec_cmple and vec_all_numeric. * testsuite/gcc.dg/altivec-10.c: Test vec_cmple and vec_all_numeric.
......
// { dg-do compile }
// { dg-options "-fabi-version=2" }
// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
// PR 13242
// mangled template arguments that are external objects incorrectly
extern int N;
template <int &> struct S {};
void n (S<N>) {}
// { dg-final { scan-assembler "\n_Z1n1SILZ1NEE:" } }
// { dg-do compile }
// { dg-options "-fabi-version=1 -Wabi" }
// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
// PR 13242
// mangled template arguments that are external objects incorrectly
extern int N;
template <int &> struct S {};
void n (S<N>) {} // { dg-warning "mangled name" }
// { dg-final { scan-assembler "\n_Z1n1SIXadL_Z1NEEE:" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment