From: jason Date: Sat, 31 Oct 2015 16:19:50 +0000 (+0000) Subject: Improve deduction failure diagnostics. X-Git-Tag: upstream/6.1~3546 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6cc56b65ed93f1510af2cbec36eb950b9a337f70;p=platform%2Fupstream%2Flinaro-gcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@229627 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a995242..592eb5d 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 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 } }