[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