aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaConcept.cpp
diff options
context:
space:
mode:
authorMatheus Izvekov <mizvekov@gmail.com>2025-04-03 14:27:18 -0300
committerGitHub <noreply@github.com>2025-04-03 14:27:18 -0300
commitcfee056b4e75cd941591d298e0f8dc303460c57e (patch)
tree03f3bf29ef837c5e3e3bc3ddeff2d7fe714ad42d /clang/lib/Sema/SemaConcept.cpp
parent262b9b515330daf7c446cc7983bf5f89185b3666 (diff)
downloadllvm-cfee056b4e75cd941591d298e0f8dc303460c57e.zip
llvm-cfee056b4e75cd941591d298e0f8dc303460c57e.tar.gz
llvm-cfee056b4e75cd941591d298e0f8dc303460c57e.tar.bz2
[clang] NFC: introduce UnsignedOrNone as a replacement for std::optional<unsigned> (#134142)
This introduces a new class 'UnsignedOrNone', which models a lite version of `std::optional<unsigned>`, but has the same size as 'unsigned'. This replaces most uses of `std::optional<unsigned>`, and similar schemes utilizing 'int' and '-1' as sentinel. Besides the smaller size advantage, this is simpler to serialize, as its internal representation is a single unsigned int as well.
Diffstat (limited to 'clang/lib/Sema/SemaConcept.cpp')
-rw-r--r--clang/lib/Sema/SemaConcept.cpp16
1 files changed, 7 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index e10c492..011a6d0 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -289,7 +289,7 @@ static ExprResult EvaluateAtomicConstraint(
return SubstitutedExpression;
}
-std::optional<unsigned> static EvaluateFoldExpandedConstraintSize(
+static UnsignedOrNone EvaluateFoldExpandedConstraintSize(
Sema &S, const CXXFoldExpr *FE, const NamedDecl *Template,
SourceLocation TemplateNameLoc, const MultiLevelTemplateArgumentList &MLTAL,
ConstraintSatisfaction &Satisfaction) {
@@ -304,15 +304,14 @@ std::optional<unsigned> static EvaluateFoldExpandedConstraintSize(
assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
bool Expand = true;
bool RetainExpansion = false;
- std::optional<unsigned> OrigNumExpansions = FE->getNumExpansions(),
- NumExpansions = OrigNumExpansions;
+ UnsignedOrNone NumExpansions = FE->getNumExpansions();
if (S.CheckParameterPacksForExpansion(
FE->getEllipsisLoc(), Pattern->getSourceRange(), Unexpanded, MLTAL,
Expand, RetainExpansion, NumExpansions) ||
!Expand || RetainExpansion)
return std::nullopt;
- if (NumExpansions && S.getLangOpts().BracketDepth < NumExpansions) {
+ if (NumExpansions && S.getLangOpts().BracketDepth < *NumExpansions) {
S.Diag(FE->getEllipsisLoc(),
clang::diag::err_fold_expression_limit_exceeded)
<< *NumExpansions << S.getLangOpts().BracketDepth
@@ -413,12 +412,12 @@ static ExprResult calculateConstraintSatisfaction(
if (Conjunction != Satisfaction.IsSatisfied)
return Out;
}
- std::optional<unsigned> NumExpansions = EvaluateFoldExpandedConstraintSize(
+ UnsignedOrNone NumExpansions = EvaluateFoldExpandedConstraintSize(
S, FE, Template, TemplateNameLoc, MLTAL, Satisfaction);
if (!NumExpansions)
return ExprError();
for (unsigned I = 0; I < *NumExpansions; I++) {
- Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, I);
+ Sema::ArgPackSubstIndexRAII SubstIndex(S, I);
ExprResult Res = calculateConstraintSatisfaction(
S, FE->getPattern(), Template, TemplateNameLoc, MLTAL, Satisfaction);
if (Res.isInvalid())
@@ -589,8 +588,7 @@ static bool CheckConstraintSatisfaction(
return true;
for (const AssociatedConstraint &AC : AssociatedConstraints) {
- Sema::ArgumentPackSubstitutionIndexRAII _(S,
- AC.ArgumentPackSubstitutionIndex);
+ Sema::ArgPackSubstIndexRAII _(S, AC.ArgPackSubstIndex);
ExprResult Res = calculateConstraintSatisfaction(
S, Template, TemplateIDRange.getBegin(), TemplateArgsLists,
AC.ConstraintExpr, Satisfaction);
@@ -1406,7 +1404,7 @@ substituteParameterMappings(Sema &S, NormalizedConstraint &N,
}
if (N.isFoldExpanded()) {
- Sema::ArgumentPackSubstitutionIndexRAII _(S, -1);
+ Sema::ArgPackSubstIndexRAII _(S, std::nullopt);
return substituteParameterMappings(
S, N.getFoldExpandedConstraint()->Constraint, Concept, MLTAL,
ArgsAsWritten);