[clang] ed9c75a - [Clang][NFC] Concepts normalization cleanups (#164229)

via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 20 04:15:51 PDT 2025


Author: Corentin Jabot
Date: 2025-10-20T13:15:47+02:00
New Revision: ed9c75aaac9d30fd928ec0b01b447fc1f8890098

URL: https://github.com/llvm/llvm-project/commit/ed9c75aaac9d30fd928ec0b01b447fc1f8890098
DIFF: https://github.com/llvm/llvm-project/commit/ed9c75aaac9d30fd928ec0b01b447fc1f8890098.diff

LOG: [Clang][NFC] Concepts normalization cleanups (#164229)

- typos
- use insert instead of back inserter to make allocations more efficient
- make sure the constraint cache uses canonicalized keys to avoid
redundant work

Added: 
    

Modified: 
    clang/lib/AST/ASTConcept.cpp
    clang/lib/Sema/SemaConcept.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ASTConcept.cpp b/clang/lib/AST/ASTConcept.cpp
index fd12bc4e83827..9ea104c4c3c9d 100644
--- a/clang/lib/AST/ASTConcept.cpp
+++ b/clang/lib/AST/ASTConcept.cpp
@@ -86,7 +86,7 @@ void ConstraintSatisfaction::Profile(llvm::FoldingSetNodeID &ID,
   ID.AddPointer(ConstraintOwner);
   ID.AddInteger(TemplateArgs.size());
   for (auto &Arg : TemplateArgs)
-    Arg.Profile(ID, C);
+    C.getCanonicalTemplateArgument(Arg).Profile(ID, C);
 }
 
 ConceptReference *

diff  --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index f77fca2a69e00..54cbfe46a6528 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -741,8 +741,9 @@ ExprResult ConstraintSatisfactionChecker::Evaluate(
   UnsubstitutedConstraintSatisfactionCacheResult Cache;
   Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors;
   Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied;
-  std::copy(Satisfaction.Details.begin() + Size, Satisfaction.Details.end(),
-            std::back_inserter(Cache.Satisfaction.Details));
+  Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(),
+                                    Satisfaction.Details.begin() + Size,
+                                    Satisfaction.Details.end());
   Cache.SubstExpr = E;
   S.UnsubstitutedConstraintSatisfactionCache.insert({ID, std::move(Cache)});
 
@@ -873,8 +874,9 @@ ExprResult ConstraintSatisfactionChecker::Evaluate(
   UnsubstitutedConstraintSatisfactionCacheResult Cache;
   Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors;
   Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied;
-  std::copy(Satisfaction.Details.begin() + Size, Satisfaction.Details.end(),
-            std::back_inserter(Cache.Satisfaction.Details));
+  Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(),
+                                    Satisfaction.Details.begin() + Size,
+                                    Satisfaction.Details.end());
   Cache.SubstExpr = E;
   S.UnsubstitutedConstraintSatisfactionCache.insert({ID, std::move(Cache)});
   return E;
@@ -1017,8 +1019,9 @@ ExprResult ConstraintSatisfactionChecker::Evaluate(
   UnsubstitutedConstraintSatisfactionCacheResult Cache;
   Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors;
   Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied;
-  std::copy(Satisfaction.Details.begin() + Size, Satisfaction.Details.end(),
-            std::back_inserter(Cache.Satisfaction.Details));
+  Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(),
+                                    Satisfaction.Details.begin() + Size,
+                                    Satisfaction.Details.end());
   Cache.SubstExpr = CE;
   S.UnsubstitutedConstraintSatisfactionCache.insert({ID, std::move(Cache)});
   return CE;
@@ -1222,10 +1225,10 @@ bool Sema::CheckConstraintSatisfaction(
   return false;
 }
 
-static const ExprResult
-SubstituteConceptsInConstrainExpression(Sema &S, const NamedDecl *D,
-                                        const ConceptSpecializationExpr *CSE,
-                                        UnsignedOrNone SubstIndex) {
+static ExprResult
+SubstituteConceptsInConstraintExpression(Sema &S, const NamedDecl *D,
+                                         const ConceptSpecializationExpr *CSE,
+                                         UnsignedOrNone SubstIndex) {
 
   // [C++2c] [temp.constr.normal]
   // Otherwise, to form CE, any non-dependent concept template argument Ai
@@ -1260,7 +1263,7 @@ bool Sema::CheckConstraintSatisfaction(
     const ConceptSpecializationExpr *ConstraintExpr,
     ConstraintSatisfaction &Satisfaction) {
 
-  ExprResult Res = SubstituteConceptsInConstrainExpression(
+  ExprResult Res = SubstituteConceptsInConstraintExpression(
       *this, nullptr, ConstraintExpr, ArgPackSubstIndex);
   if (!Res.isUsable())
     return true;
@@ -2302,7 +2305,7 @@ NormalizedConstraint *NormalizedConstraint::fromConstraintExpr(
       ConceptDecl *CD = CSE->getNamedConcept()->getCanonicalDecl();
 
       ExprResult Res =
-          SubstituteConceptsInConstrainExpression(S, D, CSE, SubstIndex);
+          SubstituteConceptsInConstraintExpression(S, D, CSE, SubstIndex);
       if (!Res.isUsable())
         return nullptr;
 


        


More information about the cfe-commits mailing list