re PR c++/5189 (g++ -c bug.cpp crashed on simple stupid file)

PR c++/5189.
	* g++.dg/template/copy1.C: New test.

From-SVN: r52259
This commit is contained in:
Mark Mitchell 2002-04-13 01:31:10 +00:00 committed by Mark Mitchell
parent 6d840fb794
commit c1f45f89a1
4 changed files with 53 additions and 0 deletions

View File

@ -1,5 +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.
* 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.

View File

@ -2238,6 +2238,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);

View File

@ -1,3 +1,8 @@
2002-04-12 Mark Mitchell <mark@codesourcery.com>
PR c++/5189.
* g++.dg/template/copy1.C: New test.
2002-04-12 Richard Henderson <rth@redhat.com>
* gcc.c-torture/execute/20020406-1.c (DUPFFnew): Use calloc.

View File

@ -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" "" }