commit f631e5b5b0e1497225875b6ee37c97945cea11b6 Author: Jason Merrill Date: Fri Oct 30 13:36:35 2015 -0400 Improve deduction failure diagnostics. * pt.c (unify): Don't diagnose no common base if we already have the same template. (do_auto_deduction): Explain deduction failure. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 243464d..c6ef2f5 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19633,7 +19633,16 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, explain_p, &t); if (!t) - return unify_no_common_base (explain_p, r, parm, arg); + { + /* Don't give the derived diagnostic if we're + already dealing with the same template. */ + bool same_template + = (CLASSTYPE_TEMPLATE_INFO (arg) + && (CLASSTYPE_TI_TEMPLATE (parm) + == CLASSTYPE_TI_TEMPLATE (arg))); + return unify_no_common_base (explain_p && !same_template, + r, parm, arg); + } } } else if (CLASSTYPE_TEMPLATE_INFO (arg) @@ -23500,6 +23509,9 @@ do_auto_deduction (tree type, tree init, tree auto_node, error ("unable to deduce lambda return type from %qE", init); else error ("unable to deduce %qT from %qE", type, init); + type_unification_real (tparms, targs, parms, &init, 1, 0, + DEDUCE_CALL, LOOKUP_NORMAL, + NULL, /*explain_p=*/true); } return error_mark_node; } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit77.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit77.C index b97c1cd..d79ee7f 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/explicit77.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit77.C @@ -15,5 +15,5 @@ void g() { f<0>(s0, s2); f(s0, s2); // { dg-error "" } no matching function - // { dg-message "(candidate|deduced conflicting types|ambiguous base class)" "candidate note" { target *-*-* } 17 } + // { dg-message "(candidate|deduced conflicting|ambiguous base class)" "candidate note" { target *-*-* } 17 } }