summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_error_codes/src/error_codes/E0728.md
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0728.md')
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0728.md75
1 files changed, 75 insertions, 0 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0728.md b/compiler/rustc_error_codes/src/error_codes/E0728.md
new file mode 100644
index 000000000..f4968a4f0
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0728.md
@@ -0,0 +1,75 @@
+[`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