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>
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
declaration if the old variable had an incomplete type and the new
variable does not.
......
......@@ -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);
......
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.
......
// { 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