================
@@ -11714,13 +11715,52 @@ 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 {
+ // TODO write tests for type constrained classes
+ if (auto *constraint = TTPD->getTypeConstraint())
----------------
AidanGoldfarb wrote:
I am still not sure how I want to handle concepts, as [some
information](https://en.cppreference.com/w/cpp/concepts) leads me to believe
there should be no diagnostic at all (ill formed). I will make sure there is no
unused variable when I ready the PR for review.
https://github.com/llvm/llvm-project/pull/122754
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits