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
This commit is contained in:
parent
079c81dabf
commit
ce4609958f
3 changed files with 22 additions and 1 deletions
|
@ -1,5 +1,10 @@
|
|||
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)
|
||||
|
|
15
gcc/testsuite/g++.dg/cpp0x/sfinae65.C
Normal file
15
gcc/testsuite/g++.dg/cpp0x/sfinae65.C
Normal file
|
@ -0,0 +1,15 @@
|
|||
// 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" }
|
||||
}
|
Loading…
Add table
Reference in a new issue