[llvm-branch-commits] [clang] [clang] Finish implementation of P0522 (PR #96023)
Matheus Izvekov via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jun 19 09:27:08 PDT 2024
================
@@ -6369,27 +6451,88 @@ bool Sema::isTemplateTemplateParameterAtLeastAsSpecializedAs(
// be inverted between Ps and As. On non-deduced context, matching needs to
// happen both ways, according to [temp.arg.template]p3, but this is
// currently implemented as a special case elsewhere.
- if (::DeduceTemplateArguments(*this, A, AArgs, PArgs, Info, Deduced,
- /*NumberOfArgumentsMustMatch=*/false,
- IsDeduced ? PackFold::ArgumentToParameter
- : PackFold::ParameterToArgument) !=
- TemplateDeductionResult::Success)
+ switch (TemplateDeductionResult Result = ::DeduceTemplateArguments(
+ *this, A, AArgs, PArgs, Info, Deduced,
+ /*NumberOfArgumentsMustMatch=*/false,
+ IsDeduced ? PackFold::ArgumentToParameter : PackFold::Both)) {
+ case clang::TemplateDeductionResult::Success:
+ break;
+
+ case TemplateDeductionResult::MiscellaneousDeductionFailure:
+ Diag(AArg->getLocation(), diag::err_template_param_list_different_arity)
+ << (A->size() > P->size()) << /*isTemplateTemplateParameter=*/true
+ << SourceRange(A->getTemplateLoc(), P->getRAngleLoc());
+ return false;
+ case TemplateDeductionResult::NonDeducedMismatch:
+ Diag(AArg->getLocation(), diag::err_non_deduced_mismatch)
+ << Info.FirstArg << Info.SecondArg;
+ return false;
+ case TemplateDeductionResult::Inconsistent:
+ Diag(getAsNamedDecl(Info.Param)->getLocation(),
+ diag::err_inconsistent_deduction)
+ << Info.FirstArg << Info.SecondArg;
+ return false;
+ case TemplateDeductionResult::AlreadyDiagnosed:
return false;
+ // None of these should happen for a plain deduction.
+ case TemplateDeductionResult::Invalid:
+ case TemplateDeductionResult::InstantiationDepth:
+ case TemplateDeductionResult::Incomplete:
+ case TemplateDeductionResult::IncompletePack:
+ case TemplateDeductionResult::Underqualified:
+ case TemplateDeductionResult::SubstitutionFailure:
+ case TemplateDeductionResult::DeducedMismatch:
+ case TemplateDeductionResult::DeducedMismatchNested:
+ case TemplateDeductionResult::TooManyArguments:
+ case TemplateDeductionResult::TooFewArguments:
+ case TemplateDeductionResult::InvalidExplicitArguments:
+ case TemplateDeductionResult::NonDependentConversionFailure:
+ case TemplateDeductionResult::ConstraintsNotSatisfied:
+ case TemplateDeductionResult::CUDATargetMismatch:
----------------
mizvekov wrote:
I think the sheer amount of enumerators here is an indication of this growing without careful design.
We could probably refactor this and collapse a lot of these cases into fewer cases, and such.
I think it would also be helpful to not have one TemplateDeductionResult to rule them all, when some times you are dealing with the subset of the problem and a lot of these cases don't apply at all.
https://github.com/llvm/llvm-project/pull/96023
More information about the llvm-branch-commits
mailing list