[clang] [Clang][Sema] Store constraints-not-satisfied deduction info as ASTConstraintSatisfaction (PR #198168)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 18 03:03:00 PDT 2026
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 <jinsong at isrc.iscas.ac.cn>
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 <51485740+lux-QAQ at users.noreply.github.com>
Date: Mon, 18 May 2026 18:02:50 +0800
Subject: [PATCH 2/2] Apply suggestion from @zyn0217
Co-authored-by: Younan Zhang <zyn7109 at gmail.com>
---
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();
More information about the cfe-commits
mailing list