Commit 9928a3d5 by Mark Mitchell Committed by Mark Mitchell

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
parent c740732f
2002-04-12 Mark Mitchell <mark@codesourcery.com> 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 * decl.c (duplicate_decls): Do not copy the RTL for a variable
declaration if the old variable had an incomplete type and the new declaration if the old variable had an incomplete type and the new
variable does not. variable does not.
......
...@@ -2221,6 +2221,36 @@ add_template_candidate_real (candidates, tmpl, ctype, explicit_targs, ...@@ -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);
......
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.
......
// { 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" "" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment