@@ -110,6 +110,8 @@ static void diagSyntacticUseRestrictions(TypeChecker &TC, const Expr *E,
110
110
bool walkToDeclPre (Decl *D) override { return false ; }
111
111
bool walkToTypeReprPre (TypeRepr *T) override { return true ; }
112
112
113
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
114
+
113
115
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
114
116
// See through implicit conversions of the expression. We want to be able
115
117
// to associate the parent of this expression with the ultimate callee.
@@ -1408,6 +1410,8 @@ static void diagRecursivePropertyAccess(TypeChecker &TC, const Expr *E,
1408
1410
cast<VarDecl>(DRE->getDecl ())->isSelfParameter ();
1409
1411
}
1410
1412
1413
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
1414
+
1411
1415
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
1412
1416
Expr *subExpr;
1413
1417
bool isStore = false ;
@@ -1556,11 +1560,10 @@ static void diagnoseImplicitSelfUseInClosure(TypeChecker &TC, const Expr *E,
1556
1560
return false ;
1557
1561
}
1558
1562
1563
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
1564
+
1559
1565
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
1560
1566
if (auto *CE = dyn_cast<AbstractClosureExpr>(E)) {
1561
- if (!CE->hasSingleExpressionBody ())
1562
- return { false , E };
1563
-
1564
1567
// If this is a potentially-escaping closure expression, start looking
1565
1568
// for references to self if we aren't already.
1566
1569
if (isClosureRequiringSelfQualification (CE))
@@ -2387,7 +2390,7 @@ class VarDeclUsageChecker : public ASTWalker {
2387
2390
// other things going on in the initializer expressions.
2388
2391
return true ;
2389
2392
}
2390
-
2393
+
2391
2394
// / The heavy lifting happens when visiting expressions.
2392
2395
std::pair<bool , Expr *> walkToExprPre (Expr *E) override ;
2393
2396
@@ -2772,8 +2775,6 @@ void VarDeclUsageChecker::markStoredOrInOutExpr(Expr *E, unsigned Flags) {
2772
2775
E->walk (*this );
2773
2776
}
2774
2777
2775
-
2776
-
2777
2778
// / The heavy lifting happens when visiting expressions.
2778
2779
std::pair<bool , Expr *> VarDeclUsageChecker::walkToExprPre (Expr *E) {
2779
2780
// Sema leaves some subexpressions null, which seems really unfortunate. It
@@ -3020,6 +3021,8 @@ static void checkStmtConditionTrailingClosure(TypeChecker &TC, const Expr *E) {
3020
3021
public:
3021
3022
DiagnoseWalker (TypeChecker &tc) : TC(tc) { }
3022
3023
3024
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3025
+
3023
3026
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
3024
3027
// Dig into implicit expression.
3025
3028
if (E->isImplicit ()) return { true , E };
@@ -3151,6 +3154,8 @@ class ObjCSelectorWalker : public ASTWalker {
3151
3154
ObjCSelectorWalker (TypeChecker &tc, const DeclContext *dc, Type selectorTy)
3152
3155
: TC(tc), DC(dc), SelectorTy(selectorTy) { }
3153
3156
3157
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3158
+
3154
3159
std::pair<bool , Expr *> walkToExprPre (Expr *expr) override {
3155
3160
auto *stringLiteral = dyn_cast<StringLiteralExpr>(expr);
3156
3161
bool fromStringLiteral = false ;
@@ -3827,14 +3832,12 @@ static void diagnoseUnintendedOptionalBehavior(TypeChecker &TC, const Expr *E,
3827
3832
}
3828
3833
}
3829
3834
3835
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3836
+
3830
3837
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
3831
3838
if (!E || isa<ErrorExpr>(E) || !E->getType ())
3832
3839
return { false , E };
3833
3840
3834
- if (auto *CE = dyn_cast<AbstractClosureExpr>(E))
3835
- if (!CE->hasSingleExpressionBody ())
3836
- return { false , E };
3837
-
3838
3841
if (IgnoredExprs.count (E))
3839
3842
return { true , E };
3840
3843
@@ -3901,6 +3904,8 @@ static void diagnoseDeprecatedWritableKeyPath(TypeChecker &TC, const Expr *E,
3901
3904
}
3902
3905
}
3903
3906
3907
+ bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3908
+
3904
3909
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
3905
3910
if (!E || isa<ErrorExpr>(E) || !E->getType ())
3906
3911
return {false , E};
0 commit comments