Change:
Hi I'm pretty new to rust and programming in general. I was trying (failing) to write some toy async code and I got this internal compiler error, the theme seems to be always report ICEs so here we go This was from cargo: ~ The code I was trying was this code: ~ <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --This issue has been assigned to via . <!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
Minimized:
ICEs with any statement between while inside a function that isn't async ICE Error without and without the ICE statement inside async function
claim
This is actually the same as . I think I've got a fix for both.
do you have a PR for this open?
Closing as a duplicate of , both of which are fixed by

Discussion:
err.span_label(item_sp, "this is not `async`"); } err.emit(); <del> return hir::ExprKind::Err; </del> } } let span = self.mark_span_with_reason(

} /// The yield kind that caused an `ExprKind::Yield`. <del> #[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] </del> <ins> #[derive(Copy, Clone, PartialEq, Eq, Debug, RustcEncodable, RustcDecodable, HashStable)] </ins> pub enum YieldSource { /// An `<expr>.await`. Await,

ExprKind::Index(ref base, ref idx) => { self.check_expr_index(base, idx, needs, expr) } <del> ExprKind::Yield(ref value, _) => { self.check_expr_yield(value, expr) </del> <ins> ExprKind::Yield(ref value, ref src) => { self.check_expr_yield(value, expr, src) </ins> } hir::ExprKind::Err => { tcx.types.err

} } <del> fn check_expr_yield(&self, value: &'tcx hir::Expr, expr: &'tcx hir::Expr) -> Ty<'tcx> { </del> <ins> fn check_expr_yield( &self, value: &'tcx hir::Expr, expr: &'tcx hir::Expr, src: &'tcx hir::YieldSource ) -> Ty<'tcx> { </ins> match self.yield_ty { Some(ty) => { self.check_expr_coercable_to_type(&value, ty); } <del> None => { </del> <ins> // Given that this `yield` expression was generated as a result of lowering a `.await`, // we know that the yield type must be `()`; however, the context won't contain this // information. Hence, we check the source of the yield expression here and check its // value's type against `()` (this check should always hold). None if src == &hir::YieldSource::Await => { self.check_expr_coercable_to_type(&value, self.tcx.mk_unit()); } _ => { </ins> struct_span_err!(self.tcx.sess, expr.span, E0627, "yield statement outside of generator literal").emit(); }

async fn foo() {} fn make_generator() { <del> let _gen = || foo.await; //~ ERROR `await` is only allowed inside `async` functions and blocks </del> <ins> let _gen = || foo().await; //~^ ERROR `await` is only allowed inside `async` functions and blocks </ins> } fn main() {}

error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-51719.rs:10:19 | <del> LL |     let _gen = || foo.await; |                -- ^^^^^^^^^ only allowed inside `async` functions and blocks </del> <ins> LL |     let _gen = || foo().await; |                -- ^^^^^^^^^^^ only allowed inside `async` functions and blocks </ins> |                | |                this is not `async`

<ins> // edition:2018 #![feature(async_await)] async fn print_dur() {} fn main() { async { let (); }.await; //~^ ERROR `await` is only allowed inside `async` functions and blocks async { //~^ ERROR `await` is only allowed inside `async` functions and blocks let task1 = print_dur().await; }.await; (async || 2333)().await; //~^ ERROR `await` is only allowed inside `async` functions and blocks (|_| 2333).await; //~^ ERROR `await` is only allowed inside `async` functions and blocks //~^^ ERROR } </ins>

<ins> error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-62009.rs:8:5 | LL | fn main() { |    ---- this is not `async` LL |     async { let (); }.await; |     ^^^^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-62009.rs:10:5 | LL |   fn main() { |      ---- this is not `async` ... LL | /     async { LL | | LL | |         let task1 = print_dur().await; LL | |     }.await; | |___________^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-62009.rs:14:5 | LL | fn main() { |    ---- this is not `async` ... LL |     (async || 2333)().await; |     ^^^^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-62009.rs:16:5 | LL | fn main() { |    ---- this is not `async` ... LL |     (|_| 2333).await; |     ^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0277]: the trait bound `[closure@$DIR/issue-62009.rs:16:5: 16:15]: std::future::Future` is not satisfied --> $DIR/issue-62009.rs:16:5 | LL |     (|_| 2333).await; |     ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009.rs:16:5: 16:15]` | = note: required by `std::future::poll_with_tls_context` error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0277`. </ins>