================ @@ -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