From 9928a3d53a7d5d2a9a2ac1d9012f86b475d1c4b6 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sat, 13 Apr 2002 01:33:23 +0000 Subject: [PATCH] re PR c++/5189 (g++ -c bug.cpp crashed on simple stupid file) 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 | 6 ++++++ gcc/cp/call.c | 30 +++++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/template/copy1.C | 14 +++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/copy1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c075ed0f1b1..ca9251a2d80 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-04-12 Mark Mitchell + + PR c++/5189. + * call.c (add_template_candidate_real): Do not treat member + templates as copy constructors. + 2002-04-12 Mark Mitchell * decl.c (duplicate_decls): Do not copy the RTL for a variable diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d341fb08084..12832cb28a6 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7c9ce2cce1f..b04b99b38c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2002-04-12 Mark Mitchell + + PR c++/5189. + * call.c (add_template_candidate_real): Do not treat member + templates as copy constructors. + 2002-04-12 Richard Henderson * 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 index 00000000000..3b45cc08386 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/copy1.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: hkluender@otg.com + +// PR 5189 + +struct A +{ + A(A&); // { dg-error "candidate" "" } + template A(T); +}; + +A a = 0; // { dg-error "no matching function|initializing" "" } + -- 2.30.2