@@ -111,6 +111,8 @@ static void diagSyntacticUseRestrictions(TypeChecker &TC, const Expr *E,
111111 bool walkToDeclPre (Decl *D) override { return false ; }
112112 bool walkToTypeReprPre (TypeRepr *T) override { return true ; }
113113
114+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
115+
114116 std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
115117 // See through implicit conversions of the expression. We want to be able
116118 // to associate the parent of this expression with the ultimate callee.
@@ -582,7 +584,7 @@ static void diagSyntacticUseRestrictions(TypeChecker &TC, const Expr *E,
582584 void checkNoEscapeParameterUse (DeclRefExpr *DRE, Expr *parent,
583585 OperandKind useKind) {
584586 // This only cares about declarations of noescape function type.
585- auto AFT = DRE->getDecl ()->getInterfaceType ()-> getAs <AnyFunctionType >();
587+ auto AFT = DRE->getType ()->getAs <FunctionType >();
586588 if (!AFT || !AFT->isNoEscape ())
587589 return ;
588590
@@ -1399,6 +1401,8 @@ static void diagRecursivePropertyAccess(TypeChecker &TC, const Expr *E,
13991401 cast<VarDecl>(DRE->getDecl ())->isSelfParameter ();
14001402 }
14011403
1404+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
1405+
14021406 std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
14031407 Expr *subExpr;
14041408 bool isStore = false ;
@@ -1547,11 +1551,10 @@ static void diagnoseImplicitSelfUseInClosure(TypeChecker &TC, const Expr *E,
15471551 return false ;
15481552 }
15491553
1554+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
1555+
15501556 std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
15511557 if (auto *CE = dyn_cast<AbstractClosureExpr>(E)) {
1552- if (!CE->hasSingleExpressionBody ())
1553- return { false , E };
1554-
15551558 // If this is a potentially-escaping closure expression, start looking
15561559 // for references to self if we aren't already.
15571560 if (isClosureRequiringSelfQualification (CE))
@@ -2348,7 +2351,7 @@ class VarDeclUsageChecker : public ASTWalker {
23482351 // other things going on in the initializer expressions.
23492352 return true ;
23502353 }
2351-
2354+
23522355 // / The heavy lifting happens when visiting expressions.
23532356 std::pair<bool , Expr *> walkToExprPre (Expr *E) override ;
23542357
@@ -2733,8 +2736,6 @@ void VarDeclUsageChecker::markStoredOrInOutExpr(Expr *E, unsigned Flags) {
27332736 E->walk (*this );
27342737}
27352738
2736-
2737-
27382739// / The heavy lifting happens when visiting expressions.
27392740std::pair<bool , Expr *> VarDeclUsageChecker::walkToExprPre (Expr *E) {
27402741 // Sema leaves some subexpressions null, which seems really unfortunate. It
@@ -2975,6 +2976,8 @@ static void checkStmtConditionTrailingClosure(TypeChecker &TC, const Expr *E) {
29752976 public:
29762977 DiagnoseWalker (TypeChecker &tc) : TC(tc) { }
29772978
2979+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
2980+
29782981 std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
29792982 // Dig into implicit expression.
29802983 if (E->isImplicit ()) return { true , E };
@@ -3106,6 +3109,8 @@ class ObjCSelectorWalker : public ASTWalker {
31063109 ObjCSelectorWalker (TypeChecker &tc, const DeclContext *dc, Type selectorTy)
31073110 : TC(tc), DC(dc), SelectorTy(selectorTy) { }
31083111
3112+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3113+
31093114 std::pair<bool , Expr *> walkToExprPre (Expr *expr) override {
31103115 auto *stringLiteral = dyn_cast<StringLiteralExpr>(expr);
31113116 bool fromStringLiteral = false ;
@@ -3777,14 +3782,12 @@ static void diagnoseUnintendedOptionalBehavior(TypeChecker &TC, const Expr *E,
37773782 }
37783783 }
37793784
3785+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3786+
37803787 std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
37813788 if (!E || isa<ErrorExpr>(E) || !E->getType ())
37823789 return { false , E };
37833790
3784- if (auto *CE = dyn_cast<AbstractClosureExpr>(E))
3785- if (!CE->hasSingleExpressionBody ())
3786- return { false , E };
3787-
37883791 if (IgnoredExprs.count (E))
37893792 return { true , E };
37903793
@@ -3851,6 +3854,8 @@ static void diagnoseDeprecatedWritableKeyPath(TypeChecker &TC, const Expr *E,
38513854 }
38523855 }
38533856
3857+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3858+
38543859 std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
38553860 if (!E || isa<ErrorExpr>(E) || !E->getType ())
38563861 return {false , E};
0 commit comments