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>
|
2002-04-12 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* decl.c (duplicate_decls): Do not copy the RTL for a variable
|
* 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)
|
if (fn == error_mark_node)
|
||||||
return candidates;
|
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)
|
if (obj != NULL_TREE)
|
||||||
/* Aha, this is a conversion function. */
|
/* Aha, this is a conversion function. */
|
||||||
cand = add_conv_candidate (candidates, fn, obj, arglist);
|
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>
|
2002-04-12 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* gcc.c-torture/execute/20020406-1.c (DUPFFnew): Use calloc.
|
* 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