================ @@ -11714,13 +11714,49 @@ 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(); + std::string ParamName = ParamD->getNameAsString(); + TemplateArgument SecondArg = *DeductionFailure.getSecondArg(); + + if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(ParamD)) { + if (TTPD->wasDeclaredWithTypename()) + S.Diag(Templated->getLocation(), + diag::note_ovl_candidate_explicit_arg_mismatch_named_ttpd) + << ParamD->getDeclName() << FirstArg << SecondArg << ParamName + << "type"; + else { + if (TTPD->getTypeConstraint()) + llvm_unreachable("ill-formed program"); + else + S.Diag(Templated->getLocation(), + diag::note_ovl_candidate_explicit_arg_mismatch_named_ttpd) + << ParamD->getDeclName() << FirstArg << SecondArg << ParamName + << "class"; + } + } else if (auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(ParamD)) { + if (SecondArg.isNull()) { + // Expected constant of type 'int', got type 'int' + S.Diag(Templated->getLocation(), + diag::note_ovl_candidate_explicit_arg_mismatch_named_nttpd_a) + << ParamD->getDeclName() << FirstArg << NTTPD->getType(); + } else { + // Could not convert A from B to C + S.Diag(Templated->getLocation(), + diag::note_ovl_candidate_explicit_arg_mismatch_named_nttpd_b) + << ParamD->getDeclName() << FirstArg << SecondArg + << NTTPD->getType(); + } + } else if (auto *TTempPD = dyn_cast<TemplateTemplateParmDecl>(ParamD)) { + TTempPD->dump(); + S.Diag(Templated->getLocation(), + diag::note_ovl_candidate_explicit_arg_mismatch_named) + << ParamD->getDeclName(); ---------------- AidanGoldfarb wrote:
My initial thought was no, as we are casting a `NamedDecl` not a `TemplateParameter`. If the latter was case, one of the three casts would be guaranteed to succeed, but I am not sure if that is still the case with the former. 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