diff options
author | Saar Raz <saar@raz.email> | 2020-01-30 20:46:32 +0200 |
---|---|---|
committer | Saar Raz <saar@raz.email> | 2020-01-30 20:54:12 +0200 |
commit | 6c6ea5995f261f0baa2be8a216ad08186551c622 (patch) | |
tree | 32112b98739e5cb809c50b67c14ea62e7354f3c8 | |
parent | a3609357f3888685f5d864d5708421b0993650b8 (diff) | |
download | bcm5719-llvm-6c6ea5995f261f0baa2be8a216ad08186551c622.tar.gz bcm5719-llvm-6c6ea5995f261f0baa2be8a216ad08186551c622.zip |
[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).
(cherry picked from commit a424ef99e7b9821ec80564af3d3a8f091323a38c)
-rwxr-xr-x | clang/lib/Sema/SemaConcept.cpp | 7 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 |
2 files changed, 6 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index e5c0fa28c11..8fdc6023040 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 4f777e7b981..2a8302e9d22 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; |