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
This commit is contained in:
parent
c740732f62
commit
9928a3d53a
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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" "" }
|
||||
|
Loading…
Reference in New Issue