Author: Saar Raz Date: 2020-01-30T20:46:32+02:00 New Revision: a424ef99e7b9821ec80564af3d3a8f091323a38c
URL: https://github.com/llvm/llvm-project/commit/a424ef99e7b9821ec80564af3d3a8f091323a38c DIFF: https://github.com/llvm/llvm-project/commit/a424ef99e7b9821ec80564af3d3a8f091323a38c.diff LOG: [Concepts] Add check for dependent RC when checking function constraints Do not attempt to check a dependent requires clause in a function constraint (may be triggered by, for example, DiagnoseUseOfDecl). Added: Modified: clang/lib/Sema/SemaConcept.cpp clang/lib/Sema/SemaExpr.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index e5c0fa28c11f..8fdc6023040f 100755 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -325,9 +325,10 @@ bool Sema::CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc) { const Expr *RC = FD->getTrailingRequiresClause(); - assert(!RC->isInstantiationDependent() && - "CheckFunctionConstraints can only be used with functions with " - "non-dependent constraints"); + if (RC->isInstantiationDependent()) { + Satisfaction.IsSatisfied = true; + return false; + } // We substitute with empty arguments in order to rebuild the atomic // constraint in a constant-evaluated context. // FIXME: Should this be a dedicated TreeTransform? diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index b063247bf1df..81eee22af4ee 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -333,11 +333,9 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs, // // See if this is a function with constraints that need to be satisfied. if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { - if (Expr *RC = FD->getTrailingRequiresClause()) { + if (FD->getTrailingRequiresClause()) { ConstraintSatisfaction Satisfaction; - bool Failed = CheckConstraintSatisfaction(FD, {RC}, /*TemplateArgs=*/{}, - SourceRange(Loc), Satisfaction); - if (Failed) + if (CheckFunctionConstraints(FD, Satisfaction, Loc)) // A diagnostic will have already been generated (non-constant // constraint expression, for example) return true; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits