diff options
author | Matheus Izvekov <mizvekov@gmail.com> | 2025-04-03 14:27:18 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-03 14:27:18 -0300 |
commit | cfee056b4e75cd941591d298e0f8dc303460c57e (patch) | |
tree | 03f3bf29ef837c5e3e3bc3ddeff2d7fe714ad42d /clang/lib/Sema/SemaConcept.cpp | |
parent | 262b9b515330daf7c446cc7983bf5f89185b3666 (diff) | |
download | llvm-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.cpp | 16 |
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); |