Commit ce460995 by Jason Merrill Committed by Jason Merrill

PR c++/86932 - missed SFINAE with empty pack.

The issue here was that when processing the explicit template args in
fn_type_unification we added an empty argument pack for the parameter pack,
so we never tried to do any deduction for it, and therefore never looked at
its type.  We need that empty pack behavior for partial ordering, but we
don't want it here, so let's make it conditional on tf_partial.

	* pt.c (coerce_template_parms): Don't add an empty pack if
	tf_partial.
	(fn_type_unification): Pass tf_partial to coerce_template_parms.

From-SVN: r269965
parent 079c81da
2019-03-26 Jason Merrill <jason@redhat.com>
PR c++/86932 - missed SFINAE with empty pack.
* pt.c (coerce_template_parms): Don't add an empty pack if
tf_partial.
(fn_type_unification): Pass tf_partial to coerce_template_parms.
PR c++/86429 - constexpr variable in lambda.
PR c++/82643
PR c++/87327
......
......@@ -8436,6 +8436,7 @@ coerce_template_parms (tree parms,
arg = NULL_TREE;
if (template_parameter_pack_p (TREE_VALUE (parm))
&& (arg || !(complain & tf_partial))
&& !(arg && ARGUMENT_PACK_P (arg)))
{
/* Some arguments will be placed in the
......@@ -20077,7 +20078,7 @@ fn_type_unification (tree fn,
substitution context. */
explicit_targs
= (coerce_template_parms (tparms, explicit_targs, NULL_TREE,
complain,
complain|tf_partial,
/*require_all_args=*/false,
/*use_default_args=*/false));
if (explicit_targs == error_mark_node)
......
// PR c++/86932
// { dg-do compile { target c++11 } }
template<bool, typename T> struct enable_if { using type = T; };
template<typename T> struct enable_if<false, T> { };
template<typename> struct is_foo { static constexpr bool value = false; };
// { dg-error "enable_if" "" { target *-*-* } .+1 }
template<class U, typename enable_if<is_foo<U>::value, int>::type...> void f() {}
int main()
{
f<int>(); // { dg-error "no match" }
}
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