re PR c++/5189 (g++ -c bug.cpp crashed on simple stupid file)
authorMark Mitchell <mark@codesourcery.com>
Sat, 13 Apr 2002 01:33:23 +0000 (01:33 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sat, 13 Apr 2002 01:33:23 +0000 (01:33 +0000)
PR c++/5189.
* call.c (add_template_candidate_real): Do not treat member
templates as copy constructors.

PR c++/5189.
* g++.dg/template/copy1.C: New test.

From-SVN: r52260

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/copy1.C [new file with mode: 0644]

index c075ed0f1b103dad31e022687c3c1e801bb60eeb..ca9251a2d8013b85babbc0d94c4943fa7facae65 100644 (file)
@@ -1,3 +1,9 @@
+2002-04-12  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/5189.
+       * call.c (add_template_candidate_real): Do not treat member
+       templates as copy constructors.
+
 2002-04-12  Mark Mitchell  <mark@codesourcery.com>
 
        * decl.c (duplicate_decls): Do not copy the RTL for a variable
index d341fb080847031fe53316f7814a898eeb825a5b..12832cb28a6040f9f3b86c3fa66950dd85bab513 100644 (file)
@@ -2221,6 +2221,36 @@ add_template_candidate_real (candidates, tmpl, ctype, explicit_targs,
   if (fn == error_mark_node)
     return candidates;
 
+  /* In [class.copy]:
+
+       A member function template is never instantiated to perform the
+       copy of a class object to an object of its class type.  
+
+     It's a little unclear what this means; the standard explicitly
+     does allow a template to be used to copy a class.  For example,
+     in:
+
+       struct A {
+         A(A&);
+        template <class T> A(const T&);
+       };
+       const A f ();
+       void g () { A a (f ()); }
+       
+     the member template will be used to make the copy.  The section
+     quoted above appears in the paragraph that forbids constructors
+     whose only parameter is (a possibly cv-qualified variant of) the
+     class type, and a logical interpretation is that the intent was
+     to forbid the instantiation of member templates which would then
+     have that form.  */
+  if (DECL_CONSTRUCTOR_P (fn) && list_length (arglist) == 2) 
+    {
+      tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (fn);
+      if (arg_types && same_type_p (TYPE_MAIN_VARIANT (TREE_VALUE (arg_types)),
+                                   ctype))
+       return candidates;
+    }
+
   if (obj != NULL_TREE)
     /* Aha, this is a conversion function.  */
     cand = add_conv_candidate (candidates, fn, obj, arglist);
index 7c9ce2cce1f81da34ed4768f2814dbd7bc9614e0..b04b99b38c9a765f2c7d4413bede24e289d70a47 100644 (file)
@@ -1,3 +1,9 @@
+2002-04-12  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/5189.
+       * call.c (add_template_candidate_real): Do not treat member
+       templates as copy constructors.
+
 2002-04-12  Richard Henderson  <rth@redhat.com>
 
        * gcc.c-torture/execute/20020406-1.c (DUPFFnew): Use calloc.
diff --git a/gcc/testsuite/g++.dg/template/copy1.C b/gcc/testsuite/g++.dg/template/copy1.C
new file mode 100644 (file)
index 0000000..3b45cc0
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: hkluender@otg.com
+
+// PR 5189
+
+struct A
+{
+  A(A&); // { dg-error "candidate" "" }
+  template <class T> A(T); 
+};
+
+A a = 0; // { dg-error "no matching function|initializing" "" }
+