@@ -2311,28 +2311,44 @@ bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
2311
2311
}
2312
2312
2313
2313
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
+
2314
2327
auto sequenceProto = TypeChecker::getProtocol (
2315
2328
dc->getASTContext (), stmt->getForLoc (), KnownProtocolKind::Sequence);
2316
2329
if (!sequenceProto)
2317
- return true ;
2330
+ return failed () ;
2318
2331
2319
2332
// Precheck the sequence.
2320
2333
Expr *sequence = stmt->getSequence ();
2321
2334
if (ConstraintSystem::preCheckExpression (sequence, dc))
2322
- return true ;
2335
+ return failed () ;
2323
2336
stmt->setSequence (sequence);
2324
2337
2325
2338
// Precheck the filtering condition.
2326
2339
if (Expr *whereExpr = stmt->getWhere ()) {
2327
2340
if (ConstraintSystem::preCheckExpression (whereExpr, dc))
2328
- return true ;
2341
+ return failed () ;
2329
2342
2330
2343
stmt->setWhere (whereExpr);
2331
2344
}
2332
2345
2333
2346
auto target = SolutionApplicationTarget::forForEachStmt (
2334
2347
stmt, sequenceProto, dc, /* bindPatternVarsOneWay=*/ false );
2335
- return !typeCheckExpression (target);
2348
+ if (!typeCheckExpression (target))
2349
+ return failed ();
2350
+
2351
+ return false ;
2336
2352
}
2337
2353
2338
2354
bool TypeChecker::typeCheckCondition (Expr *&expr, DeclContext *dc) {
0 commit comments