@@ -1306,11 +1306,27 @@ class Context {
1306
1306
highlight = apply->getSourceRange ();
1307
1307
1308
1308
auto diag = diag::async_call_without_await;
1309
+
1309
1310
// To produce a better error message, check if it is an autoclosure.
1310
1311
// We do not use 'Context::isAutoClosure' b/c it gives conservative answers.
1311
- if (Function && llvm::isa_and_nonnull<AutoClosureExpr>(
1312
- Function->getAbstractClosureExpr ()))
1313
- diag = diag::async_call_without_await_in_autoclosure;
1312
+ if (Function) {
1313
+ if (auto autoclosure = dyn_cast_or_null<AutoClosureExpr>(
1314
+ Function->getAbstractClosureExpr ())) {
1315
+ switch (autoclosure->getThunkKind ()) {
1316
+ case AutoClosureExpr::Kind::None:
1317
+ diag = diag::async_call_without_await_in_autoclosure;
1318
+ break ;
1319
+
1320
+ case AutoClosureExpr::Kind::AsyncLet:
1321
+ diag = diag::async_call_without_await_in_async_let;
1322
+ break ;
1323
+
1324
+ case AutoClosureExpr::Kind::SingleCurryThunk:
1325
+ case AutoClosureExpr::Kind::DoubleCurryThunk:
1326
+ break ;
1327
+ }
1328
+ }
1329
+ }
1314
1330
1315
1331
ctx.Diags .diagnose (node.getStartLoc (), diag)
1316
1332
.fixItInsert (node.getStartLoc (), " await " )
@@ -1636,24 +1652,32 @@ class CheckEffectsCoverage : public EffectsHandlingWalker<CheckEffectsCoverage>
1636
1652
ShouldRecurse_t checkAutoClosure (AutoClosureExpr *E) {
1637
1653
ContextScope scope (*this , Context::forClosure (E));
1638
1654
scope.enterSubFunction ();
1639
- scope.resetCoverageForAutoclosureBody ();
1640
1655
1656
+ bool shouldPreserveCoverage = true ;
1641
1657
switch (E->getThunkKind ()) {
1642
1658
case AutoClosureExpr::Kind::DoubleCurryThunk:
1643
1659
case AutoClosureExpr::Kind::SingleCurryThunk:
1644
1660
// Curry thunks aren't actually a call to the asynchronous function.
1645
1661
// Assume that async is covered in such contexts.
1662
+ scope.resetCoverageForAutoclosureBody ();
1646
1663
Flags.set (ContextFlags::IsAsyncCovered);
1647
1664
break ;
1648
1665
1649
1666
case AutoClosureExpr::Kind::None:
1667
+ scope.resetCoverageForAutoclosureBody ();
1668
+ break ;
1669
+
1650
1670
case AutoClosureExpr::Kind::AsyncLet:
1671
+ scope.resetCoverage ();
1672
+ shouldPreserveCoverage = false ;
1651
1673
break ;
1652
1674
}
1653
1675
1654
1676
E->getBody ()->walk (*this );
1655
1677
1656
- scope.preserveCoverageFromAutoclosureBody ();
1678
+ if (shouldPreserveCoverage)
1679
+ scope.preserveCoverageFromAutoclosureBody ();
1680
+
1657
1681
return ShouldNotRecurse;
1658
1682
}
1659
1683
0 commit comments