@@ -2562,6 +2562,9 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2562
2562
2563
2563
// / Do we have any 'await's in this context?
2564
2564
HasAnyAwait = 0x80 ,
2565
+
2566
+ // / Are we in an 'async let' initializer context?
2567
+ InAsyncLet = 0x100 ,
2565
2568
};
2566
2569
private:
2567
2570
unsigned Bits;
@@ -2707,8 +2710,7 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2707
2710
}
2708
2711
2709
2712
void enterAsyncLet () {
2710
- Self.Flags .set (ContextFlags::IsTryCovered);
2711
- Self.Flags .set (ContextFlags::IsAsyncCovered);
2713
+ Self.Flags .set (ContextFlags::InAsyncLet);
2712
2714
}
2713
2715
2714
2716
void refineLocalContext (Context newContext) {
@@ -2747,6 +2749,11 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2747
2749
// 'async'.
2748
2750
}
2749
2751
2752
+ void setCoverageForSingleValueStmtExpr () {
2753
+ resetCoverage ();
2754
+ Self.Flags .mergeFrom (ContextFlags::InAsyncLet, OldFlags);
2755
+ }
2756
+
2750
2757
void preserveCoverageFromSingleValueStmtExpr () {
2751
2758
// We need to preserve whether we saw any throwing sites, to avoid warning
2752
2759
// on 'do { let x = if .random() { try ... } else { ... } } catch { ... }'
@@ -2918,7 +2925,7 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
2918
2925
// For an if/switch expression, we reset coverage such that a 'try'/'await'
2919
2926
// does not cover the branches.
2920
2927
ContextScope scope (*this , /* newContext*/ llvm::None);
2921
- scope.resetCoverage ();
2928
+ scope.setCoverageForSingleValueStmtExpr ();
2922
2929
SVE->getStmt ()->walk (*this );
2923
2930
scope.preserveCoverageFromSingleValueStmtExpr ();
2924
2931
return ShouldNotRecurse;
@@ -3173,7 +3180,8 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
3173
3180
classification.getAsyncReason ());
3174
3181
}
3175
3182
// Diagnose async calls that are outside of an await context.
3176
- else if (!Flags.has (ContextFlags::IsAsyncCovered)) {
3183
+ else if (!(Flags.has (ContextFlags::IsAsyncCovered) ||
3184
+ Flags.has (ContextFlags::InAsyncLet))) {
3177
3185
Expr *expr = E.dyn_cast <Expr*>();
3178
3186
Expr *anchor = walkToAnchor (expr, parentMap,
3179
3187
CurContext.isWithinInterpolatedString ());
@@ -3209,7 +3217,8 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
3209
3217
break ;
3210
3218
3211
3219
bool isTryCovered =
3212
- (!requiresTry || Flags.has (ContextFlags::IsTryCovered));
3220
+ (!requiresTry || Flags.has (ContextFlags::IsTryCovered) ||
3221
+ Flags.has (ContextFlags::InAsyncLet));
3213
3222
if (!CurContext.handlesThrows (throwsKind)) {
3214
3223
CurContext.diagnoseUnhandledThrowSite (Ctx.Diags , E, isTryCovered,
3215
3224
classification.getThrowReason ());
0 commit comments