diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-17 17:14:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:22:20 +0000 | 
| commit | 1ac55f4cb0001fed92329746c730aa9a947c09a5 (patch) | |
| tree | 78b2d7f739b7a4b29aa297366416bf701b6ebde8 /contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp | |
| parent | bdd1243df58e60e85101c09001d9812a789b6bc4 (diff) | |
| parent | 8a37c71e9d8855c91b9ef296ed389248f960bb52 (diff) | |
Diffstat (limited to 'contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp')
| -rwxr-xr-x | contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp b/contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp index 4d4b2482d046..a92bbde113fc 100755 --- a/contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp +++ b/contrib/llvm-project/clang/lib/Sema/SemaConcept.cpp @@ -150,11 +150,19 @@ bool Sema::CheckConstraintExpression(const Expr *ConstraintExpression,  namespace {  struct SatisfactionStackRAII {    Sema &SemaRef; -  SatisfactionStackRAII(Sema &SemaRef, llvm::FoldingSetNodeID FSNID) +  bool Inserted = false; +  SatisfactionStackRAII(Sema &SemaRef, const NamedDecl *ND, +                        llvm::FoldingSetNodeID FSNID)        : SemaRef(SemaRef) { -      SemaRef.PushSatisfactionStackEntry(FSNID); +      if (ND) { +      SemaRef.PushSatisfactionStackEntry(ND, FSNID); +      Inserted = true; +      } +  } +  ~SatisfactionStackRAII() { +        if (Inserted) +          SemaRef.PopSatisfactionStackEntry();    } -  ~SatisfactionStackRAII() { SemaRef.PopSatisfactionStackEntry(); }  };  } // namespace @@ -273,7 +281,8 @@ calculateConstraintSatisfaction(Sema &S, const Expr *ConstraintExpr,  }  static bool -DiagRecursiveConstraintEval(Sema &S, llvm::FoldingSetNodeID &ID, const Expr *E, +DiagRecursiveConstraintEval(Sema &S, llvm::FoldingSetNodeID &ID, +                            const NamedDecl *Templ, const Expr *E,                              const MultiLevelTemplateArgumentList &MLTAL) {    E->Profile(ID, S.Context, /*Canonical=*/true);    for (const auto &List : MLTAL) @@ -286,7 +295,7 @@ DiagRecursiveConstraintEval(Sema &S, llvm::FoldingSetNodeID &ID, const Expr *E,    // expression, or when trying to determine the constexpr-ness of special    // members. Otherwise we could just use the    // Sema::InstantiatingTemplate::isAlreadyBeingInstantiated function. -  if (S.SatisfactionStackContains(ID)) { +  if (S.SatisfactionStackContains(Templ, ID)) {      S.Diag(E->getExprLoc(), diag::err_constraint_depends_on_self)          << const_cast<Expr *>(E) << E->getSourceRange();      return true; @@ -317,13 +326,14 @@ static ExprResult calculateConstraintSatisfaction(              return ExprError();            llvm::FoldingSetNodeID ID; -          if (DiagRecursiveConstraintEval(S, ID, AtomicExpr, MLTAL)) { +          if (Template && +              DiagRecursiveConstraintEval(S, ID, Template, AtomicExpr, MLTAL)) {              Satisfaction.IsSatisfied = false;              Satisfaction.ContainsErrors = true;              return ExprEmpty();            } -          SatisfactionStackRAII StackRAII(S, ID); +          SatisfactionStackRAII StackRAII(S, Template, ID);            // We do not want error diagnostics escaping here.            Sema::SFINAETrap Trap(S); @@ -1132,8 +1142,7 @@ substituteParameterMappings(Sema &S, NormalizedConstraint &N,    Sema::InstantiatingTemplate Inst(        S, ArgsAsWritten->arguments().front().getSourceRange().getBegin(),        Sema::InstantiatingTemplate::ParameterMappingSubstitution{}, Concept, -      SourceRange(ArgsAsWritten->arguments()[0].getSourceRange().getBegin(), -                  ArgsAsWritten->arguments().back().getSourceRange().getEnd())); +      ArgsAsWritten->arguments().front().getSourceRange());    if (S.SubstTemplateArguments(*Atomic.ParameterMapping, MLTAL, SubstArgs))      return true;  | 
