@@ -670,6 +670,8 @@ class EffectsHandlingWalker : public ASTWalker {
670
670
recurse = asImpl ().checkForEach (forEach);
671
671
} else if (auto labeled = dyn_cast<LabeledConditionalStmt>(S)) {
672
672
asImpl ().noteLabeledConditionalStmt (labeled);
673
+ } else if (auto defer = dyn_cast<DeferStmt>(S)) {
674
+ recurse = asImpl ().checkDefer (defer);
673
675
}
674
676
675
677
if (!recurse)
@@ -2110,6 +2112,10 @@ class ApplyClassifier {
2110
2112
return ShouldRecurse;
2111
2113
}
2112
2114
2115
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
2116
+ return ShouldNotRecurse;
2117
+ }
2118
+
2113
2119
ShouldRecurse_t checkSingleValueStmtExpr (SingleValueStmtExpr *SVE) {
2114
2120
return ShouldRecurse;
2115
2121
}
@@ -2255,6 +2261,10 @@ class ApplyClassifier {
2255
2261
return ShouldRecurse;
2256
2262
}
2257
2263
2264
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
2265
+ return ShouldNotRecurse;
2266
+ }
2267
+
2258
2268
ShouldRecurse_t checkSingleValueStmtExpr (SingleValueStmtExpr *SVE) {
2259
2269
return ShouldRecurse;
2260
2270
}
@@ -2354,6 +2364,10 @@ class ApplyClassifier {
2354
2364
return ShouldNotRecurse;
2355
2365
}
2356
2366
2367
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
2368
+ return ShouldNotRecurse;
2369
+ }
2370
+
2357
2371
ShouldRecurse_t checkSingleValueStmtExpr (SingleValueStmtExpr *SVE) {
2358
2372
return ShouldRecurse;
2359
2373
}
@@ -4398,6 +4412,17 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
4398
4412
return ShouldRecurse;
4399
4413
}
4400
4414
4415
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
4416
+ // Pretend we're in an 'unsafe'.
4417
+ ContextScope scope (*this , std::nullopt);
4418
+ scope.enterUnsafe (S->getDeferLoc ());
4419
+
4420
+ // Walk the call expression. We don't care about the rest.
4421
+ S->getCallExpr ()->walk (*this );
4422
+
4423
+ return ShouldNotRecurse;
4424
+ }
4425
+
4401
4426
void diagnoseRedundantTry (AnyTryExpr *E) const {
4402
4427
if (auto *SVE = SingleValueStmtExpr::tryDigOutSingleValueStmtExpr (E)) {
4403
4428
// For an if/switch expression, produce a tailored warning.
0 commit comments