================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits