re PR c++/13883 (Assembler messages: symbol is already defined)
authorMark Mitchell <mark@codesourcery.com>
Thu, 29 Jan 2004 16:47:14 +0000 (16:47 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 29 Jan 2004 16:47:14 +0000 (16:47 +0000)
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
gcc/cp/mangle.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/ctor3.C [new file with mode: 0644]

index 6ce445c..19e787e 100644 (file)
@@ -1,3 +1,9 @@
+2004-01-29  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/13883
+       * mangle.c (write_encoding): Correct encoding of member template
+       constructors.
+
 2004-01-28  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
        * parser.c (cp_parser_template_id): Parse tentatively `[:' after a 
index 6552fe3..70b022b 100644 (file)
@@ -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);
     }
 }
 
index 3833667..45e6186 100644 (file)
@@ -1,3 +1,8 @@
+2004-01-29  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/13883
+       * g++.dg/template/ctor3.C: New test.
+
 2004-01-29  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
        * 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 (file)
index 0000000..d3eb2c3
--- /dev/null
@@ -0,0 +1,19 @@
+struct A {};
+struct B;
+
+template <class TP> struct X: virtual A {
+  template <class TP2> X(TP2* ptr) {}
+  template <class TP2> X(const X<TP2>) {}
+};
+
+struct Y : X<B> { 
+  Y(A* a) : X<B>(a) {}
+};
+
+void func1(X<B>);
+
+void func2() {
+  A a;
+  Y y(&a);
+  func1(X<A>(&a));
+}