Yes, but with some caveats.
There are potential suspension points on entry/exit edges between async
functions because of the possibility for isolation change, and those are not explicit in the source of the function. However, since every call to an async
function has to be await
ed, you can think of that await
as also covering those points.
A somewhat more egregious case is that there's an implicit suspension point when an async let
goes out of scope. Normally, that suspension point does not actually suspend because you've already await
ed the async let
. But there can be paths out of the scope that haven't passed through that await
(e.g. throwing an error), and the containing function still has to wait for the subtask to finish before those paths can continue. In that proposal, we just decided that this was an acceptable deviation from the general rule that there's a visible await
.
Like resuming a CheckedContinuation
, yielding into an AsyncStream
's Continuation
is not a potential suspension point: it unblocks any tasks waiting on the stream and allows them to be scheduled again, but the current task continues running without interruption.