diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2019-05-16 13:17:40 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2019-05-16 13:58:44 -0700 |
| commit | c61660500555c81d6049b7e7b5b502d1bd9df80f (patch) | |
| tree | 4105d1785b55393975ca162ee26865133c56a1f0 /src | |
| parent | 91c36c40bdd68d928f9202077309ae48f575d187 (diff) | |
| download | rust-c61660500555c81d6049b7e7b5b502d1bd9df80f.tar.gz rust-c61660500555c81d6049b7e7b5b502d1bd9df80f.zip | |
Point at enclosing fn/closure when it's not async
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/hir/lowering.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/await-keyword/incorrect-syntax-suggestions.rs | 14 | ||||
| -rw-r--r-- | src/test/ui/await-keyword/incorrect-syntax-suggestions.stderr | 58 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-51719.stderr | 7 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-51751.stderr | 6 |
5 files changed, 60 insertions, 41 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index 12ccc79e4ab..3a8b139236c 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -99,7 +99,7 @@ pub struct LoweringContext<'a> { /// Used to get the current `fn`'s def span to point to when using `await` /// outside of an `async fn`. - current_item_id: Option<hir::HirId>, + current_item: Option<Span>, catch_scopes: Vec<NodeId>, loop_scopes: Vec<NodeId>, @@ -254,7 +254,7 @@ pub fn lower_crate( node_id_to_hir_id: IndexVec::new(), is_generator: false, is_async_body: false, - current_item_id: None, + current_item: None, is_in_trait_impl: false, lifetimes_to_define: Vec::new(), is_collecting_in_band_lifetimes: false, @@ -3120,8 +3120,8 @@ impl<'a> LoweringContext<'a> { } ItemKind::Fn(ref decl, ref header, ref generics, ref body) => { let fn_def_id = self.resolver.definitions().local_def_id(id); - let hir_id = self.lower_node_id(id); self.with_new_scopes(|this| { + this.current_item = Some(ident.span); let mut lower_fn = |decl: &FnDecl| { // Note: we don't need to change the return type from `T` to // `impl Future<Output = T>` here because lower_body @@ -3159,7 +3159,6 @@ impl<'a> LoweringContext<'a> { } else { lower_fn(decl) }; - this.current_item_id = Some(hir_id); hir::ItemKind::Fn( fn_decl, @@ -3661,6 +3660,7 @@ impl<'a> LoweringContext<'a> { } else { lower_method(sig) }; + self.current_item = Some(i.span); (generics, hir::ImplItemKind::Method(sig, body_id)) } @@ -4277,6 +4277,7 @@ impl<'a> LoweringContext<'a> { let fn_decl = self.lower_fn_decl(decl, None, false, None); self.with_new_scopes(|this| { + this.current_item = Some(fn_decl_span); let mut is_generator = false; let body_id = this.lower_body(Some(decl), |this| { let e = this.lower_expr(body); @@ -5565,11 +5566,8 @@ impl<'a> LoweringContext<'a> { "`await` is only allowed inside `async` functions and blocks" ); err.span_label(await_span, "only allowed inside `async` functions and blocks"); - if let Some(item_id) = self.current_item_id { - err.span_label( - self.sess.source_map().def_span(self.items[&item_id].span), - "this function is not `async`", - ); + if let Some(item_sp) = self.current_item { + err.span_label(item_sp, "this is not `async`"); } err.emit(); return hir::ExprKind::Err; diff --git a/src/test/ui/await-keyword/incorrect-syntax-suggestions.rs b/src/test/ui/await-keyword/incorrect-syntax-suggestions.rs index ca3654d3c87..6b615cc9ff9 100644 --- a/src/test/ui/await-keyword/incorrect-syntax-suggestions.rs +++ b/src/test/ui/await-keyword/incorrect-syntax-suggestions.rs @@ -89,5 +89,19 @@ fn foo16() -> Result<(), ()> { let _ = bar().await?; //~ ERROR `await` is only allowed inside `async` functions and blocks Ok(()) } +fn foo24() -> Result<(), ()> { + fn foo() -> Result<(), ()> { + let _ = bar().await?; //~ ERROR `await` is only allowed inside `async` functions and blocks + Ok(()) + } + foo() +} +fn foo25() -> Result<(), ()> { + let foo = || { + let _ = bar().await?; //~ ERROR `await` is only allowed inside `async` functions and blocks + Ok(()) + }; + foo() +} fn main() {} diff --git a/src/test/ui/await-keyword/incorrect-syntax-suggestions.stderr b/src/test/ui/await-keyword/incorrect-syntax-suggestions.stderr index 2e2efedcf00..5ea59d4bcee 100644 --- a/src/test/ui/await-keyword/incorrect-syntax-suggestions.stderr +++ b/src/test/ui/await-keyword/incorrect-syntax-suggestions.stderr @@ -91,75 +91,83 @@ LL | let _ = bar().await()?; error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:55:13 | -LL | async fn foo8() -> Result<(), ()> { - | --------------------------------- this function is not `async` -... +LL | fn foo9() -> Result<(), ()> { + | ---- this is not `async` LL | let _ = await bar(); | ^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:60:13 | -LL | fn foo9() -> Result<(), ()> { - | --------------------------- this function is not `async` -... +LL | fn foo10() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = await? bar(); | ^^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:65:13 | -LL | fn foo10() -> Result<(), ()> { - | ---------------------------- this function is not `async` -... +LL | fn foo11() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = await bar()?; | ^^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:70:14 | -LL | fn foo11() -> Result<(), ()> { - | ---------------------------- this function is not `async` -... +LL | fn foo12() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = (await bar())?; | ^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:75:13 | -LL | fn foo12() -> Result<(), ()> { - | ---------------------------- this function is not `async` -... +LL | fn foo13() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = bar().await(); | ^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:80:13 | -LL | fn foo13() -> Result<(), ()> { - | ---------------------------- this function is not `async` -... +LL | fn foo14() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = bar().await()?; | ^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:85:13 | -LL | fn foo14() -> Result<(), ()> { - | ---------------------------- this function is not `async` -... +LL | fn foo15() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = bar().await; | ^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/incorrect-syntax-suggestions.rs:89:13 | -LL | fn foo15() -> Result<(), ()> { - | ---------------------------- this function is not `async` -... +LL | fn foo16() -> Result<(), ()> { + | ----- this is not `async` LL | let _ = bar().await?; | ^^^^^^^^^^^ only allowed inside `async` functions and blocks +error[E0728]: `await` is only allowed inside `async` functions and blocks + --> $DIR/incorrect-syntax-suggestions.rs:94:17 + | +LL | fn foo() -> Result<(), ()> { + | --- this is not `async` +LL | let _ = bar().await?; + | ^^^^^^^^^^^ only allowed inside `async` functions and blocks + +error[E0728]: `await` is only allowed inside `async` functions and blocks + --> $DIR/incorrect-syntax-suggestions.rs:101:17 + | +LL | let foo = || { + | -- this is not `async` +LL | let _ = bar().await?; + | ^^^^^^^^^^^ only allowed inside `async` functions and blocks + error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` --> $DIR/incorrect-syntax-suggestions.rs:18:19 | @@ -169,6 +177,6 @@ LL | let _ = await bar()?; = help: the trait `std::ops::Try` is not implemented for `impl std::future::Future` = note: required by `std::ops::Try::into_result` -error: aborting due to 24 previous errors +error: aborting due to 26 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/issues/issue-51719.stderr b/src/test/ui/issues/issue-51719.stderr index cb4a5e90370..c06165b2446 100644 --- a/src/test/ui/issues/issue-51719.stderr +++ b/src/test/ui/issues/issue-51719.stderr @@ -1,11 +1,10 @@ error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-51719.rs:10:19 | -LL | async fn foo() {} - | -------------- this function is not `async` -... LL | let _gen = || foo.await; - | ^^^^^^^^^ only allowed inside `async` functions and blocks + | -- ^^^^^^^^^ only allowed inside `async` functions and blocks + | | + | this is not `async` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-51751.stderr b/src/test/ui/issues/issue-51751.stderr index 842b99f16f2..97b63d1590e 100644 --- a/src/test/ui/issues/issue-51751.stderr +++ b/src/test/ui/issues/issue-51751.stderr @@ -1,9 +1,9 @@ error[E0728]: `await` is only allowed inside `async` functions and blocks --> $DIR/issue-51751.rs:11:20 | -LL | async fn inc(limit: i64) -> i64 { - | ------------------------------- this function is not `async` -... +LL | fn main() { + | ---- this is not `async` +LL | let result = inc(10000); LL | let finished = result.await; | ^^^^^^^^^^^^ only allowed inside `async` functions and blocks |
