From 4a5e0ed992ed75f1514c270f45282f28ddb7a4b9 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 29 Jan 2004 16:47:14 +0000 Subject: [PATCH] re PR c++/13883 (Assembler messages: symbol is already defined) PR c++/13883 * mangle.c (write_encoding): Correct encoding of member template constructors. PR c++/13883 * g++.dg/template/ctor3.C: New test. From-SVN: r76868 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/mangle.c | 17 ++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/ctor3.C | 19 +++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/ctor3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6ce445c..19e787e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-01-29 Mark Mitchell + + PR c++/13883 + * mangle.c (write_encoding): Correct encoding of member template + constructors. + 2004-01-28 Giovanni Bajo * parser.c (cp_parser_template_id): Parse tentatively `[:' after a diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 6552fe3..70b022b 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -688,18 +688,29 @@ write_encoding (const tree decl) if (TREE_CODE (decl) == FUNCTION_DECL) { tree fn_type; + tree d; if (decl_is_template_id (decl, NULL)) - fn_type = get_mostly_instantiated_function_type (decl); + { + fn_type = get_mostly_instantiated_function_type (decl); + /* FN_TYPE will not have parameter types for in-charge or + VTT parameters. Therefore, we pass NULL_TREE to + write_bare_function_type -- otherwise, it will get + confused about which artificial parameters to skip. */ + d = NULL_TREE; + } else - fn_type = TREE_TYPE (decl); + { + fn_type = TREE_TYPE (decl); + d = decl; + } write_bare_function_type (fn_type, (!DECL_CONSTRUCTOR_P (decl) && !DECL_DESTRUCTOR_P (decl) && !DECL_CONV_FN_P (decl) && decl_is_template_id (decl, NULL)), - decl); + d); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3833667..45e6186 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-01-29 Mark Mitchell + + PR c++/13883 + * g++.dg/template/ctor3.C: New test. + 2004-01-29 Giovanni Bajo * g++.dg/tc1: New directory. diff --git a/gcc/testsuite/g++.dg/template/ctor3.C b/gcc/testsuite/g++.dg/template/ctor3.C new file mode 100644 index 0000000..d3eb2c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor3.C @@ -0,0 +1,19 @@ +struct A {}; +struct B; + +template struct X: virtual A { + template X(TP2* ptr) {} + template X(const X) {} +}; + +struct Y : X { + Y(A* a) : X(a) {} +}; + +void func1(X); + +void func2() { + A a; + Y y(&a); + func1(X(&a)); +} -- 2.7.4