On 07/14/2014 12:20 PM, Paolo Carlini wrote:
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?!?
Unfortunately, that goes too far. I think we want a new DEDUCE_PARMS that is like DEDUCE_EXACT but does the same transformations as tsubst_arg_types in this part of unify_pack_expansion:
/* If we had explicit template arguments, substitute them into the pattern before deduction. */ if (any_explicit) { /* Some arguments might still be unspecified or dependent. */ bool dependent; ++processing_template_decl; dependent = any_dependent_template_arguments_p (targs); if (!dependent) --processing_template_decl; parm = tsubst (pattern, targs, explain_p ? tf_warning_or_error : tf_none, NULL_TREE); if (dependent) --processing_template_decl; if (parm == error_mark_node) return 1; }
Jason