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
