https://github.com/lux-QAQ updated 
https://github.com/llvm/llvm-project/pull/198168

>From cfcb81097cd66428e42ef09edcc1eb2c91760933 Mon Sep 17 00:00:00 2001
From: lijinsong2025 <[email protected]>
Date: Sun, 17 May 2026 15:42:01 +0800
Subject: [PATCH 1/2] [Clang][Sema] Use ASTConstraintSatisfaction for
 constraints-not-satisfied deduction info

---
 clang/include/clang/Sema/Sema.h |  3 +++
 clang/lib/Sema/SemaConcept.cpp  | 14 ++++++++------
 clang/lib/Sema/SemaOverload.cpp | 17 ++++++++++-------
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 5202244cee2a7..194884e9461fe 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -15075,6 +15075,9 @@ class Sema final : public SemaBase {
   void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction 
&Satisfaction,
                                      SourceLocation Loc = {},
                                      bool First = true);
+  void
+  DiagnoseUnsatisfiedConstraint(const ASTConstraintSatisfaction &Satisfaction,
+                                SourceLocation Loc = {}, bool First = true);
 
   /// \brief Emit diagnostics explaining why a constraint expression was deemed
   /// unsatisfied.
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index ac1c716b5c385..61f9048b678df 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -2007,16 +2007,18 @@ void Sema::DiagnoseUnsatisfiedConstraint(
 }
 
 void Sema::DiagnoseUnsatisfiedConstraint(
-    const ConceptSpecializationExpr *ConstraintExpr, bool First) {
-
-  const ASTConstraintSatisfaction &Satisfaction =
-      ConstraintExpr->getSatisfaction();
+    const ASTConstraintSatisfaction &Satisfaction, SourceLocation Loc,
+    bool First) {
 
   assert(!Satisfaction.IsSatisfied &&
          "Attempted to diagnose a satisfied constraint");
+  ::DiagnoseUnsatisfiedConstraint(*this, Satisfaction.records(), Loc, First);
+}
 
-  ::DiagnoseUnsatisfiedConstraint(*this, Satisfaction.records(),
-                                  ConstraintExpr->getBeginLoc(), First);
+void Sema::DiagnoseUnsatisfiedConstraint(
+    const ConceptSpecializationExpr *ConstraintExpr, bool First) {
+  DiagnoseUnsatisfiedConstraint(ConstraintExpr->getSatisfaction(),
+                                ConstraintExpr->getBeginLoc(), First);
 }
 
 namespace {
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index e11bbd7085798..af4d62e494c2e 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -11,6 +11,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "CheckExprLifetime.h"
+#include "clang/AST/ASTConcept.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/CXXInheritance.h"
 #include "clang/AST/Decl.h"
@@ -741,7 +742,7 @@ namespace {
   // unsatisfied constraints.
   struct CNSInfo {
     TemplateArgumentList *TemplateArgs;
-    ConstraintSatisfaction Satisfaction;
+    const ASTConstraintSatisfaction *Satisfaction;
   };
 }
 
@@ -822,9 +823,10 @@ clang::MakeDeductionFailureInfo(ASTContext &Context,
     break;
 
   case TemplateDeductionResult::ConstraintsNotSatisfied: {
-    CNSInfo *Saved = new (Context) CNSInfo;
-    Saved->TemplateArgs = Info.takeSugared();
-    Saved->Satisfaction = std::move(Info.AssociatedConstraintsSatisfaction);
+    auto *Saved = new (Context)
+        CNSInfo{Info.takeSugared(),
+                ASTConstraintSatisfaction::Create(
+                    Context, Info.AssociatedConstraintsSatisfaction)};
     Result.Data = Saved;
     break;
   }
@@ -872,7 +874,8 @@ void DeductionFailureInfo::Destroy() {
 
   case TemplateDeductionResult::ConstraintsNotSatisfied:
     // FIXME: Destroy the template argument list?
-    static_cast<CNSInfo *>(Data)->Satisfaction.~ConstraintSatisfaction();
+    // CNSInfo and ASTConstraintSatisfaction are ASTContext-allocated and do
+    // not own non-arena resources.
     Data = nullptr;
     if (PartialDiagnosticAt *Diag = getSFINAEDiagnostic()) {
       Diag->~PartialDiagnosticAt();
@@ -11386,7 +11389,7 @@ bool 
OverloadCandidate::NotValidBecauseConstraintExprHasError() const {
          static_cast<TemplateDeductionResult>(DeductionFailure.Result) ==
              TemplateDeductionResult::ConstraintsNotSatisfied &&
          static_cast<CNSInfo *>(DeductionFailure.Data)
-             ->Satisfaction.ContainsErrors;
+             ->Satisfaction->ContainsErrors;
 }
 
 void OverloadCandidateSet::AddDeferredTemplateCandidate(
@@ -12523,7 +12526,7 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl 
*Found, Decl *Templated,
         << TemplateArgString;
 
     S.DiagnoseUnsatisfiedConstraint(
-        static_cast<CNSInfo*>(DeductionFailure.Data)->Satisfaction);
+        *static_cast<CNSInfo *>(DeductionFailure.Data)->Satisfaction);
     return;
   }
   case TemplateDeductionResult::TooManyArguments:

>From 0b300b07d7dee9cb09d0bd84a1947fb63e207055 Mon Sep 17 00:00:00 2001
From: LUX <[email protected]>
Date: Mon, 18 May 2026 18:02:50 +0800
Subject: [PATCH 2/2] Apply suggestion from @zyn0217

Co-authored-by: Younan Zhang <[email protected]>
---
 clang/lib/Sema/SemaOverload.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index af4d62e494c2e..ef67ebd9fee71 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -874,8 +874,6 @@ void DeductionFailureInfo::Destroy() {
 
   case TemplateDeductionResult::ConstraintsNotSatisfied:
     // FIXME: Destroy the template argument list?
-    // CNSInfo and ASTConstraintSatisfaction are ASTContext-allocated and do
-    // not own non-arena resources.
     Data = nullptr;
     if (PartialDiagnosticAt *Diag = getSFINAEDiagnostic()) {
       Diag->~PartialDiagnosticAt();

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to