[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).
This commit is contained in:
Saar Raz 2020-01-30 20:46:32 +02:00
parent c83d9bedc0
commit a424ef99e7
2 changed files with 6 additions and 7 deletions

View File

@ -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?

View File

@ -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;