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);
+}

Reply via email to