@@ -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)
@@ -2106,6 +2108,10 @@ class ApplyClassifier {
2106
2108
return ShouldRecurse;
2107
2109
}
2108
2110
2111
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
2112
+ return ShouldNotRecurse;
2113
+ }
2114
+
2109
2115
ShouldRecurse_t checkSingleValueStmtExpr (SingleValueStmtExpr *SVE) {
2110
2116
return ShouldRecurse;
2111
2117
}
@@ -2251,6 +2257,10 @@ class ApplyClassifier {
2251
2257
return ShouldRecurse;
2252
2258
}
2253
2259
2260
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
2261
+ return ShouldNotRecurse;
2262
+ }
2263
+
2254
2264
ShouldRecurse_t checkSingleValueStmtExpr (SingleValueStmtExpr *SVE) {
2255
2265
return ShouldRecurse;
2256
2266
}
@@ -2350,6 +2360,10 @@ class ApplyClassifier {
2350
2360
return ShouldNotRecurse;
2351
2361
}
2352
2362
2363
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
2364
+ return ShouldNotRecurse;
2365
+ }
2366
+
2353
2367
ShouldRecurse_t checkSingleValueStmtExpr (SingleValueStmtExpr *SVE) {
2354
2368
return ShouldRecurse;
2355
2369
}
@@ -4394,6 +4408,17 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
4394
4408
return ShouldRecurse;
4395
4409
}
4396
4410
4411
+ ShouldRecurse_t checkDefer (DeferStmt *S) {
4412
+ // Pretend we're in an 'unsafe'.
4413
+ ContextScope scope (*this , std::nullopt);
4414
+ scope.enterUnsafe (S->getDeferLoc ());
4415
+
4416
+ // Walk the call expression. We don't care about the rest.
4417
+ S->getCallExpr ()->walk (*this );
4418
+
4419
+ return ShouldNotRecurse;
4420
+ }
4421
+
4397
4422
void diagnoseRedundantTry (AnyTryExpr *E) const {
4398
4423
if (auto *SVE = SingleValueStmtExpr::tryDigOutSingleValueStmtExpr (E)) {
4399
4424
// For an if/switch expression, produce a tailored warning.
0 commit comments