================
@@ -11714,13 +11714,38 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl 
*Found, Decl *Templated,
     return;
   }
 
-  case TemplateDeductionResult::InvalidExplicitArguments:
+  case TemplateDeductionResult::InvalidExplicitArguments: {
     assert(ParamD && "no parameter found for invalid explicit arguments");
-    if (ParamD->getDeclName())
-      S.Diag(Templated->getLocation(),
-             diag::note_ovl_candidate_explicit_arg_mismatch_named)
-          << ParamD->getDeclName();
-    else {
+    if (ParamD->getDeclName()) {
+      TemplateArgument FirstArg = *DeductionFailure.getFirstArg();
+      TemplateArgument SecondArg = *DeductionFailure.getSecondArg();
+
+      if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(ParamD)) {
+        S.Diag(Templated->getLocation(),
+               diag::note_ovl_candidate_explicit_arg_mismatch_named)
+            << 1 << ParamD->getDeclName() << FirstArg << SecondArg
+            << TTPD->getSourceRange();
+
+      } else if (auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(ParamD)) {
+        if (SecondArg.isNull()) {
+          S.Diag(Templated->getLocation(),
+                 diag::note_ovl_candidate_explicit_arg_mismatch_named)
+              << 3 << ParamD->getDeclName() << NTTPD->getType() << FirstArg
+              << NTTPD->getSourceRange();
+        } else {
+          S.Diag(Templated->getLocation(),
+                 diag::note_ovl_candidate_explicit_arg_mismatch_named)
+              << 2 << ParamD->getDeclName() << FirstArg << SecondArg
+              << NTTPD->getType() << NTTPD->getSourceRange();
+        }
+      } else if (auto *TTempPD = dyn_cast<TemplateTemplateParmDecl>(ParamD)) {
+        // FIXME: Emit a better message here
+        S.Diag(Templated->getLocation(),
+               diag::note_ovl_candidate_explicit_arg_mismatch_named)
+            << 4 << ParamD->getDeclName() << TTempPD->getSourceRange();
+      } else
+        llvm_unreachable("unexpected param decl kind");
+    } else {
       int index = 0;
----------------
mizvekov wrote:

I think this is good, thanks!

If you want to make this even better, here is another idea:

1) Remove this fallback diagnostic 
`diag::note_ovl_candidate_explicit_arg_mismatch_unnamed` entirely.
2) On the diagnostic above, you can select to print the name only in case the 
SourceRange is empty. Then in case the name is also empty, you print the index 
instead, as this fallback does.

Like so, you avoid this degradation in diagnostics with unnamed template 
parameters, where currently your improvements don't apply to them.

https://github.com/llvm/llvm-project/pull/122754
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to