Skip to content

Commit

Permalink
Rollup merge of rust-lang#63509 - estebank:async-span, r=Centril
Browse files Browse the repository at this point in the history
Point at the right enclosing scope when using `await` in non-async fn

Fix rust-lang#63398.
  • Loading branch information
Centril authored Aug 14, 2019
2 parents 6a11bf7 + 25d507f commit a93e9ff
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/librustc/hir/lowering/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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| {
Expand All @@ -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,
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/async-await/issues/non-async-enclosing-span.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// edition:2018
#![feature(async_await)]

async fn do_the_thing() -> u8 {
8
}
// #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
}
11 changes: 11 additions & 0 deletions src/test/ui/async-await/issues/non-async-enclosing-span.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0728]: `await` is only allowed inside `async` functions and blocks
--> $DIR/non-async-enclosing-span.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

0 comments on commit a93e9ff

Please sign in to comment.