From 09833a1db1a6a24968cf4575a2a26a8823e3f3ca Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 31 Oct 2015 12:19:50 -0400 Subject: [PATCH] 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. From-SVN: r229627 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 14 +++++++++++++- gcc/testsuite/g++.old-deja/g++.pt/explicit77.C | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a995242621f..592eb5d13da 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2015-10-31 Jason Merrill + * pt.c (unify): Don't diagnose no common base if we already have + the same template. + (do_auto_deduction): Explain deduction failure. + * pt.c (hash_tmpl_and_args): Use iterative_hash_object on template uid. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 243464dbb88..c6ef2f5906e 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 b97c1cd0223..d79ee7f05e5 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 } } -- 2.30.2