[`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 { 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