-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[clang] NFCI: don't check deduced constraints when partial ordering #106882
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
We were incorrectly applying [temp.deduct]p5 to partial ordering. Marked as NFCI as I don't think the difference is actually observable in practice. During partial ordering, the deduced arguments will mostly be dependent and thus cannot be checked. Otherwise, later during overload resolution, if deduction succeeds in both directions, we will perform subsumption check for the constraints ([temp.func.order]p6).
|
@llvm/pr-subscribers-clang Author: Matheus Izvekov (mizvekov) ChangesWe were incorrectly applying [temp.deduct]p5 to partial ordering. Marked as NFCI as I don't think the difference is actually observable in practice. Full diff: https://github.com/llvm/llvm-project/pull/106882.diff 1 Files Affected:
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 11bc9f2d1e7484..01f18e5a325197 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -3313,10 +3313,12 @@ FinishTemplateArgumentDeduction(
if (Trap.hasErrorOccurred())
return TemplateDeductionResult::SubstitutionFailure;
- if (auto Result = CheckDeducedArgumentConstraints(S, Partial, SugaredBuilder,
- CanonicalBuilder, Info);
- Result != TemplateDeductionResult::Success)
- return Result;
+ if (!IsPartialOrdering) {
+ if (auto Result = CheckDeducedArgumentConstraints(
+ S, Partial, SugaredBuilder, CanonicalBuilder, Info);
+ Result != TemplateDeductionResult::Success)
+ return Result;
+ }
return TemplateDeductionResult::Success;
}
@@ -3364,13 +3366,16 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction(
if (Trap.hasErrorOccurred())
return TemplateDeductionResult::SubstitutionFailure;
- if (auto Result = CheckDeducedArgumentConstraints(S, Template, SugaredBuilder,
- CanonicalBuilder, Info);
- Result != TemplateDeductionResult::Success)
- return Result;
+ if (!PartialOrdering) {
+ if (auto Result = CheckDeducedArgumentConstraints(
+ S, Template, SugaredBuilder, CanonicalBuilder, Info);
+ Result != TemplateDeductionResult::Success)
+ return Result;
+ }
return TemplateDeductionResult::Success;
}
+
/// Complete template argument deduction for DeduceTemplateArgumentsFromType.
/// FIXME: this is mostly duplicated with the above two versions. Deduplicate
/// the three implementations.
@@ -5595,19 +5600,8 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction(
TDR != TemplateDeductionResult::Success)
return TDR;
- // C++20 [temp.deduct]p5 - Only check constraints when all parameters have
- // been deduced.
- if (!IsIncomplete) {
- if (auto Result = CheckDeducedArgumentConstraints(S, FTD, SugaredBuilder,
- CanonicalBuilder, Info);
- Result != TemplateDeductionResult::Success)
- return Result;
- }
-
- if (Trap.hasErrorOccurred())
- return TemplateDeductionResult::SubstitutionFailure;
-
- return TemplateDeductionResult::Success;
+ return Trap.hasErrorOccurred() ? TemplateDeductionResult::SubstitutionFailure
+ : TemplateDeductionResult::Success;
}
/// Determine whether the function template \p FT1 is at least as
|
zyn0217
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, but please wait for others' opinions before merging.
cor3ntin
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
We were incorrectly applying [temp.deduct]p5 to partial ordering.
Marked as NFCI as I don't think the difference is actually observable in practice.
During partial ordering, the deduced arguments will mostly be dependent and thus cannot be checked.
Otherwise, later during overload resolution, if deduction succeeds in both directions,
we will perform subsumption check for the constraints ([temp.func.order]p6).