commit 40c2934a737ba5d2e406e079a2b249245dfb17ab Author: Jason Merrill Date: Mon Jun 30 10:41:22 2014 -0400 PR c++/61539 * pt.c (unify_one_argument): Type/expression mismatch just causes deduction failure. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f0a598b..7f33b6d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -16501,8 +16501,9 @@ unify_one_argument (tree tparms, tree targs, tree parm, tree arg, maybe_adjust_types_for_deduction (strict, &parm, &arg, arg_expr); } else - gcc_assert ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL) - == (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)); + if ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL) + != (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)) + return unify_template_argument_mismatch (explain_p, parm, arg); /* For deduction from an init-list we need the actual list. */ if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr)) diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic160.C b/gcc/testsuite/g++.dg/cpp0x/variadic160.C new file mode 100644 index 0000000..20fcd5b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic160.C @@ -0,0 +1,49 @@ +// PR c++/61539 +// { dg-do compile { target c++11 } } + +template class A; +template class B; +template class C; +template <> class C +{ + virtual void xparse (int &, const B > &) const; +}; +template class G : C +{ +public: + G (void *) {} + void default_value (const T &); + void xparse (int &, const B > &) const; +}; +template +void validate (int &, const B > &, T *, int); +template +void G::xparse (int &p1, const B > &p2) const +{ + validate (p1, p2, (T *)0, 0); +} +template G *value (T *) { return new G(0); } +namespace Eigen +{ +template struct D; +template class F; +template +struct D > +{ + typedef _Scalar Scalar; +}; +template class F +{ +public: + typedef typename Eigen::D::Scalar Scalar; + F (const Scalar &, const Scalar &, const Scalar &); +}; +template +void validate (int &, const B > &, Eigen::F *); +} +int main (int, char *[]) +{ + Eigen::F a (0, 0, 0); + value (&a)->default_value (Eigen::F(0, 0, 0)); +}