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..ef67ebd9fee71 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,6 @@ void DeductionFailureInfo::Destroy() { case TemplateDeductionResult::ConstraintsNotSatisfied: // FIXME: Destroy the template argument list? - static_cast(Data)->Satisfaction.~ConstraintSatisfaction(); Data = nullptr; if (PartialDiagnosticAt *Diag = getSFINAEDiagnostic()) { Diag->~PartialDiagnosticAt(); @@ -11386,7 +11387,7 @@ bool OverloadCandidate::NotValidBecauseConstraintExprHasError() const { static_cast(DeductionFailure.Result) == TemplateDeductionResult::ConstraintsNotSatisfied && static_cast(DeductionFailure.Data) - ->Satisfaction.ContainsErrors; + ->Satisfaction->ContainsErrors; } void OverloadCandidateSet::AddDeferredTemplateCandidate( @@ -12523,7 +12524,7 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, << TemplateArgString; S.DiagnoseUnsatisfiedConstraint( - static_cast(DeductionFailure.Data)->Satisfaction); + *static_cast(DeductionFailure.Data)->Satisfaction); return; } case TemplateDeductionResult::TooManyArguments: