Hi,
I have been looking a bit into this bug, using a reduced testcase which
simplifies the debugging quite a bit for me (a non-variadic variant is
ok). I cannot say to already understand all the details of the issue,
but something which strikes me as interesting, is that the DEDUCE_CALL
passed down by add_candidate gets lost and we end up calling
type_unification_real from unify with DEDUCE_EXACT. If I change it to an
unconditional DEDUCE_CALL, the testcase is accepted and the testsuite
passes with no regressions. Is that all there is to the issue?!?
Thanks!
Paolo.
////////////////////
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 212510)
+++ cp/pt.c (working copy)
@@ -18198,7 +18198,7 @@ unify (tree tparms, tree targs, tree parm, tree ar
nargs = i;
return type_unification_real (tparms, targs, TYPE_ARG_TYPES (parm),
- args, nargs, 1, DEDUCE_EXACT,
+ args, nargs, 1, DEDUCE_CALL,
LOOKUP_NORMAL, NULL, explain_p);
}
Index: testsuite/g++.dg/cpp0x/variadic161.C
===================================================================
--- testsuite/g++.dg/cpp0x/variadic161.C (revision 0)
+++ testsuite/g++.dg/cpp0x/variadic161.C (working copy)
@@ -0,0 +1,14 @@
+// PR c++/60608
+// { dg-do compile { target c++11 } }
+
+template<typename... Args>
+void
+wrapper(void (*)(Args...));
+
+void myfun(int);
+
+void
+test()
+{
+ wrapper<const int>(myfun);
+}