From 13fd4666b076245e143102e0a43249af0001f7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 12 Aug 2019 23:56:13 -0700 Subject: [PATCH 1/2] Point at the right enclosing scope when using `await` in non-async fn --- src/librustc/hir/lowering/expr.rs | 5 ++++- src/test/ui/issues/issue-63398.rs | 11 +++++++++++ src/test/ui/issues/issue-63398.stderr | 11 +++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issues/issue-63398.rs create mode 100644 src/test/ui/issues/issue-63398.stderr diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc/hir/lowering/expr.rs index d273006fbe07e..e3a5400942d1a 100644 --- a/src/librustc/hir/lowering/expr.rs +++ b/src/librustc/hir/lowering/expr.rs @@ -677,6 +677,7 @@ impl LoweringContext<'_> { let fn_decl = self.lower_fn_decl(decl, None, false, None); self.with_new_scopes(|this| { + let prev = this.current_item; this.current_item = Some(fn_decl_span); let mut generator_kind = None; let body_id = this.lower_fn_body(decl, |this| { @@ -690,8 +691,10 @@ impl LoweringContext<'_> { generator_kind, movability, ); + let capture_clause = this.lower_capture_clause(capture_clause); + this.current_item = prev; hir::ExprKind::Closure( - this.lower_capture_clause(capture_clause), + capture_clause, fn_decl, body_id, fn_decl_span, diff --git a/src/test/ui/issues/issue-63398.rs b/src/test/ui/issues/issue-63398.rs new file mode 100644 index 0000000000000..a031687845652 --- /dev/null +++ b/src/test/ui/issues/issue-63398.rs @@ -0,0 +1,11 @@ +// edition:2018 +#![feature(async_await)] + +async fn do_the_thing() -> u8 { + 8 +} + +fn main() { + let x = move || {}; + let y = do_the_thing().await; //~ ERROR `await` is only allowed inside `async` functions +} diff --git a/src/test/ui/issues/issue-63398.stderr b/src/test/ui/issues/issue-63398.stderr new file mode 100644 index 0000000000000..b2ba46ce317cd --- /dev/null +++ b/src/test/ui/issues/issue-63398.stderr @@ -0,0 +1,11 @@ +error[E0728]: `await` is only allowed inside `async` functions and blocks + --> $DIR/issue-63398.rs:10:13 + | +LL | fn main() { + | ---- this is not `async` +LL | let x = move || {}; +LL | let y = do_the_thing().await; + | ^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks + +error: aborting due to previous error + From 25d507f497885cd26f1dba8c8e8158c12d02bd6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 13 Aug 2019 11:27:00 -0700 Subject: [PATCH 2/2] review comment: move test --- .../issues/non-async-enclosing-span.rs} | 5 +++-- .../issues/non-async-enclosing-span.stderr} | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) rename src/test/ui/{issues/issue-63398.rs => async-await/issues/non-async-enclosing-span.rs} (52%) rename src/test/ui/{issues/issue-63398.stderr => async-await/issues/non-async-enclosing-span.stderr} (87%) diff --git a/src/test/ui/issues/issue-63398.rs b/src/test/ui/async-await/issues/non-async-enclosing-span.rs similarity index 52% rename from src/test/ui/issues/issue-63398.rs rename to src/test/ui/async-await/issues/non-async-enclosing-span.rs index a031687845652..838911d9b6e8f 100644 --- a/src/test/ui/issues/issue-63398.rs +++ b/src/test/ui/async-await/issues/non-async-enclosing-span.rs @@ -4,8 +4,9 @@ async fn do_the_thing() -> u8 { 8 } - -fn main() { +// #63398: point at the enclosing scope and not the previously seen closure +fn main() { //~ NOTE this is not `async` let x = move || {}; let y = do_the_thing().await; //~ ERROR `await` is only allowed inside `async` functions + //~^ NOTE only allowed inside `async` functions and blocks } diff --git a/src/test/ui/issues/issue-63398.stderr b/src/test/ui/async-await/issues/non-async-enclosing-span.stderr similarity index 87% rename from src/test/ui/issues/issue-63398.stderr rename to src/test/ui/async-await/issues/non-async-enclosing-span.stderr index b2ba46ce317cd..f492c1a8045b5 100644 --- a/src/test/ui/issues/issue-63398.stderr +++ b/src/test/ui/async-await/issues/non-async-enclosing-span.stderr @@ -1,5 +1,5 @@ error[E0728]: `await` is only allowed inside `async` functions and blocks - --> $DIR/issue-63398.rs:10:13 + --> $DIR/non-async-enclosing-span.rs:10:13 | LL | fn main() { | ---- this is not `async`