diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6ce445c806ca..19e787e5418f 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 6552fe3a278a..70b022b000f0 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 383366743a79..45e618699734 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 000000000000..d3eb2c3f8a55 --- /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)); +}