[llvm-branch-commits] [clang] [clang] Finish implementation of P0522 (PR #96023)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jun 19 02:42:38 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:
+ llvm_unreachable("Unexpected Result");
+ }
+
SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
- Sema::InstantiatingTemplate Inst(*this, Info.getLocation(), AArg, DeducedArgs,
- Info);
- if (Inst.isInvalid())
- return false;
- bool AtLeastAsSpecialized;
+ TemplateDeductionResult TDK;
runWithSufficientStackSpace(Info.getLocation(), [&] {
- AtLeastAsSpecialized =
- ::FinishTemplateArgumentDeduction(
- *this, AArg, /*IsPartialOrdering=*/true, PArgs, Deduced, Info) ==
- TemplateDeductionResult::Success;
+ TDK = ::FinishTemplateArgumentDeduction(
+ *this, AArg, /*IsPartialOrdering=*/true, PArgs, Deduced, Info);
});
- return AtLeastAsSpecialized;
+ switch (TDK) {
+ case TemplateDeductionResult::Success:
+ return true;
+
+ // It doesn't seem possible to get a non-deduced mismatch when partial
+ // ordering TTPs.
+ case TemplateDeductionResult::NonDeducedMismatch:
+ llvm_unreachable("Unexpected NonDeducedMismatch");
+
+ // Substitution failures should have already been diagnosed.
+ case TemplateDeductionResult::AlreadyDiagnosed:
+ case TemplateDeductionResult::SubstitutionFailure:
+ case TemplateDeductionResult::InstantiationDepth:
+ return false;
+
+ // None of these should happen when just converting deduced arguments.
+ case TemplateDeductionResult::Invalid:
+ case TemplateDeductionResult::Incomplete:
+ case TemplateDeductionResult::IncompletePack:
+ case TemplateDeductionResult::Inconsistent:
+ case TemplateDeductionResult::Underqualified:
+ case TemplateDeductionResult::DeducedMismatch:
+ case TemplateDeductionResult::DeducedMismatchNested:
+ case TemplateDeductionResult::TooManyArguments:
+ case TemplateDeductionResult::TooFewArguments:
+ case TemplateDeductionResult::InvalidExplicitArguments:
+ case TemplateDeductionResult::NonDependentConversionFailure:
+ case TemplateDeductionResult::ConstraintsNotSatisfied:
+ case TemplateDeductionResult::MiscellaneousDeductionFailure:
+ case TemplateDeductionResult::CUDATargetMismatch:
+ llvm_unreachable("Unexpected Result");
----------------
cor3ntin wrote:
Ditto
https://github.com/llvm/llvm-project/pull/96023
More information about the llvm-branch-commits
mailing list