[clang] [clang][Sema] Improve template argument deduction diagnostic (PR #122754)

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 30 15:23:33 PST 2025


================
@@ -11714,27 +11714,44 @@ 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 {
-      int index = 0;
-      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ParamD))
-        index = TTP->getIndex();
-      else if (NonTypeTemplateParmDecl *NTTP
-                                  = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
-        index = NTTP->getIndex();
+    int Which = 0;
+    int Index = 0;
+    TemplateArgument FirstArg = *DeductionFailure.getFirstArg();
+    TemplateArgument SecondArg = *DeductionFailure.getSecondArg();
+    QualType Type;
+    SourceRange SrcRange;
+
+    if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(ParamD)) {
+      Which = 1;
+      Index = TTPD->getIndex();
+      SrcRange = TTPD->getSourceRange();
+    } else if (auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(ParamD)) {
+      if (SecondArg.isNull())
+        Which = 2;
----------------
mizvekov wrote:

An immediately invoked lambda + decomposition might be cleaner, but it's up to you:

```suggestion
  auto [Which, Index, Type, SrcRange] = [] -> std::tuple<int, int, QualType, SourceRange> {
    switch(ParamD->getKind()) {
    case Decl::TemplateTypeParm: {
      auto *TTPD = cast<TemplateTypeParmDecl>(ParamD);
      return {1, TTPD->getIndex(), QualType(), TTPD->getSourceRange()};
    }
    case Decl::NonTypeTemplateParm: {
       ...
    }
    ...
    }
    llvm_unreachable("unexpected param decl kind");
  }();
```

https://github.com/llvm/llvm-project/pull/122754


More information about the cfe-commits mailing list