@@ -893,6 +893,8 @@ namespace {
893893 // / implicit `ErrorExpr` in place of invalid references.
894894 bool UseErrorExprs;
895895
896+ bool LeaveClosureBodiesUnchecked;
897+
896898 // / A stack of expressions being walked, used to determine where to
897899 // / insert RebindSelfInConstructorExpr nodes.
898900 llvm::SmallVector<Expr *, 8 > ExprStack;
@@ -1080,9 +1082,11 @@ namespace {
10801082
10811083 public:
10821084 PreCheckExpression (DeclContext *dc, Expr *parent,
1083- bool replaceInvalidRefsWithErrors)
1084- : Ctx(dc->getASTContext ()), DC(dc), ParentExpr(parent),
1085- UseErrorExprs(replaceInvalidRefsWithErrors) {}
1085+ bool replaceInvalidRefsWithErrors,
1086+ bool leaveClosureBodiesUnchecked)
1087+ : Ctx(dc->getASTContext ()), DC(dc),
1088+ ParentExpr(parent), UseErrorExprs(replaceInvalidRefsWithErrors),
1089+ LeaveClosureBodiesUnchecked(leaveClosureBodiesUnchecked) {}
10861090
10871091 ASTContext &getASTContext () const { return Ctx; }
10881092
@@ -1428,8 +1432,13 @@ namespace {
14281432// / true when we want the body to be considered part of this larger expression.
14291433bool PreCheckExpression::walkToClosureExprPre (ClosureExpr *closure) {
14301434 // If we won't be checking the body of the closure, don't walk into it here.
1431- if (!shouldTypeCheckInEnclosingExpression (closure))
1432- return false ;
1435+ if (!closure->hasSingleExpressionBody ()) {
1436+ if (LeaveClosureBodiesUnchecked)
1437+ return false ;
1438+
1439+ if (!Ctx.TypeCheckerOpts .EnableMultiStatementClosureInference )
1440+ return false ;
1441+ }
14331442
14341443 // Update the current DeclContext to be the closure we're about to
14351444 // recurse into.
@@ -2082,11 +2091,15 @@ Expr *PreCheckExpression::simplifyTypeConstructionWithLiteralArg(Expr *E) {
20822091// / Pre-check the expression, validating any types that occur in the
20832092// / expression and folding sequence expressions.
20842093bool ConstraintSystem::preCheckExpression (Expr *&expr, DeclContext *dc,
2085- bool replaceInvalidRefsWithErrors) {
2094+ bool replaceInvalidRefsWithErrors,
2095+ bool leaveClosureBodiesUnchecked) {
20862096 auto &ctx = dc->getASTContext ();
20872097 FrontendStatsTracer StatsTracer (ctx.Stats , " precheck-expr" , expr);
20882098
2089- PreCheckExpression preCheck (dc, expr, replaceInvalidRefsWithErrors);
2099+ PreCheckExpression preCheck (dc, expr,
2100+ replaceInvalidRefsWithErrors,
2101+ leaveClosureBodiesUnchecked);
2102+
20902103 // Perform the pre-check.
20912104 if (auto result = expr->walk (preCheck)) {
20922105 expr = result;
0 commit comments