Commit 1561ad74 by Jason Merrill Committed by Jason Merrill

re PR c++/38543 ([C++0x] Cannot specialize variadic template function)

	PR c++/38543
	* pt.c (determine_specialization): Instead of comparing the number
	of parms, check that tsubst gives the right answer.

From-SVN: r186522
parent 54aa834f
2012-04-16 Jason Merrill <jason@redhat.com> 2012-04-16 Jason Merrill <jason@redhat.com>
PR c++/38543
* pt.c (determine_specialization): Instead of comparing the number
of parms, check that tsubst gives the right answer.
PR c++/52008 PR c++/52008
* pt.c (process_partial_specialization): Complain about a partial * pt.c (process_partial_specialization): Complain about a partial
specialization with fewer args than primary template parms. specialization with fewer args than primary template parms.
......
...@@ -1839,6 +1839,7 @@ determine_specialization (tree template_id, ...@@ -1839,6 +1839,7 @@ determine_specialization (tree template_id,
{ {
tree decl_arg_types; tree decl_arg_types;
tree fn_arg_types; tree fn_arg_types;
tree insttype;
/* 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
...@@ -1900,15 +1901,6 @@ determine_specialization (tree template_id, ...@@ -1900,15 +1901,6 @@ determine_specialization (tree template_id,
fn_arg_types fn_arg_types
= skip_artificial_parms_for (fn, 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
...@@ -1929,6 +1921,15 @@ determine_specialization (tree template_id, ...@@ -1929,6 +1921,15 @@ determine_specialization (tree template_id,
specialize TMPL will produce DECL. */ specialize TMPL will produce DECL. */
continue; continue;
/* Make sure that the deduced arguments actually work. */
insttype = tsubst (TREE_TYPE (fn), targs, tf_none, NULL_TREE);
if (insttype == error_mark_node)
continue;
fn_arg_types
= skip_artificial_parms_for (fn, TYPE_ARG_TYPES (insttype));
if (!compparms (fn_arg_types, decl_arg_types))
continue;
/* Save this template, and the arguments deduced. */ /* Save this template, and the arguments deduced. */
templates = tree_cons (targs, fn, templates); templates = tree_cons (targs, fn, templates);
} }
......
2012-04-16 Jason Merrill <jason@redhat.com> 2012-04-16 Jason Merrill <jason@redhat.com>
PR c++/38543
* g++.dg/cpp0x/variadic131.C: New.
PR c++/52008 PR c++/52008
* g++.dg/cpp0x/variadic130.C: New. * g++.dg/cpp0x/variadic130.C: New.
......
// PR c++/38543
// { dg-do compile { target c++11 } }
template< typename ... T > void foo( T ... args );
template<> void foo( ){}
template<> void foo(int,double){}
int main()
{
foo( 0, 0.0 );
return 55;
}
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