Commit ba139ba8 by Mark Mitchell Committed by Mark Mitchell

re PR c++/26988 (template constructor in template class derived from virtual…

re PR c++/26988 (template constructor in template class derived from virtual base can not be specialized)

	PR c++/26988
	* pt.c (determine_specialization): Use skip_artificial_parms_for.
	(fn_type_unificiation): Likewise.
	(get_bindings): Likewise.
	PR c++/26988
	* g++.dg/template/spec34.C: New test

From-SVN: r121822
parent a31830a7
2007-02-06 Mark Mitchell <mark@codesourcery.com> 2007-02-11 Mark Mitchell <mark@codesourcery.com>
PR c++/26988
* pt.c (determine_specialization): Use skip_artificial_parms_for.
(fn_type_unificiation): Likewise.
(get_bindings): Likewise.
o2007-02-06 Mark Mitchell <mark@codesourcery.com>
PR target/29487 PR target/29487
* decl.c (finish_function): Use DECL_REPLACEABLE. * decl.c (finish_function): Use DECL_REPLACEABLE.
......
...@@ -1436,33 +1436,6 @@ determine_specialization (tree template_id, ...@@ -1436,33 +1436,6 @@ determine_specialization (tree template_id,
tree decl_arg_types; tree decl_arg_types;
tree fn_arg_types; tree fn_arg_types;
/* DECL might be a specialization of FN. */
/* Adjust the type of DECL in case FN is a static member. */
decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
if (DECL_STATIC_FUNCTION_P (fn)
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
decl_arg_types = TREE_CHAIN (decl_arg_types);
/* Check that the number of function parameters matches.
For example,
template <class T> void f(int i = 0);
template <> void f<int>();
The specialization f<int> is invalid but is not caught
by get_bindings below. */
fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
if (list_length (fn_arg_types) != list_length (decl_arg_types))
continue;
/* For a non-static member function, we need to make sure that
the const qualification is the same. This can be done by
checking the 'this' in the argument list. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
&& !same_type_p (TREE_VALUE (fn_arg_types),
TREE_VALUE (decl_arg_types)))
continue;
/* In case of explicit specialization, we need to check if /* In case of explicit specialization, we need to check if
the number of template headers appearing in the specialization the number of template headers appearing in the specialization
is correct. This is usually done in check_explicit_specialization, is correct. This is usually done in check_explicit_specialization,
...@@ -1501,14 +1474,44 @@ determine_specialization (tree template_id, ...@@ -1501,14 +1474,44 @@ determine_specialization (tree template_id,
(current_template_parms)))) (current_template_parms))))
continue; continue;
/* DECL might be a specialization of FN. */
decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
/* For a non-static member function, we need to make sure
that the const qualification is the same. Since
get_bindings does not try to merge the "this" parameter,
we must do the comparison explicitly. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
&& !same_type_p (TREE_VALUE (fn_arg_types),
TREE_VALUE (decl_arg_types)))
continue;
/* Skip the "this" parameter and, for constructors of
classes with virtual bases, the VTT parameter. A
full specialization of a constructor will have a VTT
parameter, but a template never will. */
decl_arg_types
= skip_artificial_parms_for (decl, decl_arg_types);
fn_arg_types
= skip_artificial_parms_for (fn, fn_arg_types);
/* Check that the number of function parameters matches.
For example,
template <class T> void f(int i = 0);
template <> void f<int>();
The specialization f<int> is invalid but is not caught
by get_bindings below. */
if (list_length (fn_arg_types) != list_length (decl_arg_types))
continue;
/* Function templates cannot be specializations; there are /* Function templates cannot be specializations; there are
no partial specializations of functions. Therefore, if no partial specializations of functions. Therefore, if
the type of DECL does not match FN, there is no the type of DECL does not match FN, there is no
match. */ match. */
if (tsk == tsk_template) if (tsk == tsk_template)
{ {
if (compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)), if (compparms (fn_arg_types, decl_arg_types))
decl_arg_types))
candidates = tree_cons (NULL_TREE, fn, candidates); candidates = tree_cons (NULL_TREE, fn, candidates);
continue; continue;
} }
...@@ -9843,10 +9846,8 @@ fn_type_unification (tree fn, ...@@ -9843,10 +9846,8 @@ fn_type_unification (tree fn,
TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (converted_args, i); TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (converted_args, i);
} }
parms = TYPE_ARG_TYPES (fntype);
/* Never do unification on the 'this' parameter. */ /* Never do unification on the 'this' parameter. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)) parms = skip_artificial_parms_for (fn, TYPE_ARG_TYPES (fntype));
parms = TREE_CHAIN (parms);
if (return_type) if (return_type)
{ {
...@@ -11394,10 +11395,9 @@ get_bindings (tree fn, tree decl, tree explicit_args, bool check_rettype) ...@@ -11394,10 +11395,9 @@ get_bindings (tree fn, tree decl, tree explicit_args, bool check_rettype)
return NULL_TREE; return NULL_TREE;
} }
decl_arg_types = TYPE_ARG_TYPES (decl_type);
/* Never do unification on the 'this' parameter. */ /* Never do unification on the 'this' parameter. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)) decl_arg_types = skip_artificial_parms_for (decl,
decl_arg_types = TREE_CHAIN (decl_arg_types); TYPE_ARG_TYPES (decl_type));
if (fn_type_unification (fn, explicit_args, targs, if (fn_type_unification (fn, explicit_args, targs,
decl_arg_types, decl_arg_types,
......
2007-02-11 Mark Mitchell <mark@codesourcery.com>
PR c++/26988
* g++.dg/template/spec34.C: New test
2007-02-11 Uros Bizjak <ubizjak@gmail.com> 2007-02-11 Uros Bizjak <ubizjak@gmail.com>
* gcc.dg/vect/vect-intfloat-conversion-1.c: Loop gets vectorized * gcc.dg/vect/vect-intfloat-conversion-1.c: Loop gets vectorized
// PR c++/26988
struct B{};
struct Bar : virtual B {
template <typename T> Bar( T const& cast );
};
template <> Bar::Bar( int const & cast ) {}
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