Skip to content

Commit 0210755

Browse files
committed
[TypeChecker] Invalidate decls in foreach statement
If it's failed to type check the patterns, the sequence expression, etc., invalidate the pattern and 'VarDecl's in the pattern.
1 parent b1eec26 commit 0210755

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2311,28 +2311,44 @@ bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
23112311
}
23122312

23132313
bool TypeChecker::typeCheckForEachBinding(DeclContext *dc, ForEachStmt *stmt) {
2314+
auto &Context = dc->getASTContext();
2315+
2316+
auto failed = [&]() -> bool {
2317+
// Invalidate the pattern and the var decl.
2318+
stmt->getPattern()->setType(ErrorType::get(Context));
2319+
stmt->getPattern()->forEachVariable([&](VarDecl *var) {
2320+
if (var->hasInterfaceType() && !var->getType()->hasError())
2321+
return;
2322+
var->setInvalid();
2323+
});
2324+
return true;
2325+
};
2326+
23142327
auto sequenceProto = TypeChecker::getProtocol(
23152328
dc->getASTContext(), stmt->getForLoc(), KnownProtocolKind::Sequence);
23162329
if (!sequenceProto)
2317-
return true;
2330+
return failed();
23182331

23192332
// Precheck the sequence.
23202333
Expr *sequence = stmt->getSequence();
23212334
if (ConstraintSystem::preCheckExpression(sequence, dc))
2322-
return true;
2335+
return failed();
23232336
stmt->setSequence(sequence);
23242337

23252338
// Precheck the filtering condition.
23262339
if (Expr *whereExpr = stmt->getWhere()) {
23272340
if (ConstraintSystem::preCheckExpression(whereExpr, dc))
2328-
return true;
2341+
return failed();
23292342

23302343
stmt->setWhere(whereExpr);
23312344
}
23322345

23332346
auto target = SolutionApplicationTarget::forForEachStmt(
23342347
stmt, sequenceProto, dc, /*bindPatternVarsOneWay=*/false);
2335-
return !typeCheckExpression(target);
2348+
if (!typeCheckExpression(target))
2349+
return failed();
2350+
2351+
return false;
23362352
}
23372353

23382354
bool TypeChecker::typeCheckCondition(Expr *&expr, DeclContext *dc) {

0 commit comments

Comments
 (0)