| [`await`] has been used outside [`async`] function or [`async`] block. |
| |
| Erroneous code example: |
| |
| ```edition2018,compile_fail,E0728 |
| # use std::pin::Pin; |
| # use std::future::Future; |
| # use std::task::{Context, Poll}; |
| # |
| # struct WakeOnceThenComplete(bool); |
| # |
| # fn wake_and_yield_once() -> WakeOnceThenComplete { |
| # WakeOnceThenComplete(false) |
| # } |
| # |
| # impl Future for WakeOnceThenComplete { |
| # type Output = (); |
| # fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { |
| # if self.0 { |
| # Poll::Ready(()) |
| # } else { |
| # cx.waker().wake_by_ref(); |
| # self.0 = true; |
| # Poll::Pending |
| # } |
| # } |
| # } |
| # |
| fn foo() { |
| wake_and_yield_once().await // `await` is used outside `async` context |
| } |
| ``` |
| |
| [`await`] is used to suspend the current computation until the given |
| future is ready to produce a value. So it is legal only within |
| an [`async`] context, like an `async` function or an `async` block. |
| |
| ```edition2018 |
| # use std::pin::Pin; |
| # use std::future::Future; |
| # use std::task::{Context, Poll}; |
| # |
| # struct WakeOnceThenComplete(bool); |
| # |
| # fn wake_and_yield_once() -> WakeOnceThenComplete { |
| # WakeOnceThenComplete(false) |
| # } |
| # |
| # impl Future for WakeOnceThenComplete { |
| # type Output = (); |
| # fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { |
| # if self.0 { |
| # Poll::Ready(()) |
| # } else { |
| # cx.waker().wake_by_ref(); |
| # self.0 = true; |
| # Poll::Pending |
| # } |
| # } |
| # } |
| # |
| async fn foo() { |
| wake_and_yield_once().await // `await` is used within `async` function |
| } |
| |
| fn bar(x: u8) -> impl Future<Output = u8> { |
| async move { |
| wake_and_yield_once().await; // `await` is used within `async` block |
| x |
| } |
| } |
| ``` |
| |
| [`async`]: https://doc.rust-lang.org/std/keyword.async.html |
| [`await`]: https://doc.rust-lang.org/std/keyword.await.html |