@@ -2051,6 +2051,9 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2051
2051
2052
2052
// / Do we have any 'await's in this context?
2053
2053
HasAnyAwait = 0x80 ,
2054
+
2055
+ // / Are we in an 'async let' initializer context?
2056
+ InAsyncLet = 0x100 ,
2054
2057
};
2055
2058
private:
2056
2059
unsigned Bits;
@@ -2196,8 +2199,7 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2196
2199
}
2197
2200
2198
2201
void enterAsyncLet () {
2199
- Self.Flags .set (ContextFlags::IsTryCovered);
2200
- Self.Flags .set (ContextFlags::IsAsyncCovered);
2202
+ Self.Flags .set (ContextFlags::InAsyncLet);
2201
2203
}
2202
2204
2203
2205
void refineLocalContext (Context newContext) {
@@ -2236,6 +2238,11 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2236
2238
// 'async'.
2237
2239
}
2238
2240
2241
+ void setCoverageForSingleValueStmtExpr () {
2242
+ resetCoverage ();
2243
+ Self.Flags .mergeFrom (ContextFlags::InAsyncLet, OldFlags);
2244
+ }
2245
+
2239
2246
void preserveCoverageFromSingleValueStmtExpr () {
2240
2247
// We need to preserve whether we saw any throwing sites, to avoid warning
2241
2248
// on 'do { let x = if .random() { try ... } else { ... } } catch { ... }'
@@ -2393,7 +2400,7 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2393
2400
// For an if/switch expression, we reset coverage such that a 'try'/'await'
2394
2401
// does not cover the branches.
2395
2402
ContextScope scope (*this , /* newContext*/ llvm::None);
2396
- scope.resetCoverage ();
2403
+ scope.setCoverageForSingleValueStmtExpr ();
2397
2404
SVE->getStmt ()->walk (*this );
2398
2405
scope.preserveCoverageFromSingleValueStmtExpr ();
2399
2406
return ShouldNotRecurse;
@@ -2734,7 +2741,8 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2734
2741
classification.getAsyncReason ());
2735
2742
}
2736
2743
// Diagnose async calls that are outside of an await context.
2737
- else if (!Flags.has (ContextFlags::IsAsyncCovered)) {
2744
+ else if (!(Flags.has (ContextFlags::IsAsyncCovered) ||
2745
+ Flags.has (ContextFlags::InAsyncLet))) {
2738
2746
Expr *expr = E.dyn_cast <Expr*>();
2739
2747
Expr *anchor = walkToAnchor (expr, parentMap,
2740
2748
CurContext.isWithinInterpolatedString ());
@@ -2770,7 +2778,8 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2770
2778
break ;
2771
2779
2772
2780
bool isTryCovered =
2773
- (!requiresTry || Flags.has (ContextFlags::IsTryCovered));
2781
+ (!requiresTry || Flags.has (ContextFlags::IsTryCovered) ||
2782
+ Flags.has (ContextFlags::InAsyncLet));
2774
2783
if (!CurContext.handlesThrows (throwsKind)) {
2775
2784
CurContext.diagnoseUnhandledThrowSite (Ctx.Diags , E, isTryCovered,
2776
2785
classification.getThrowReason ());
0 commit comments