diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-10-01 09:55:37 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-10-01 09:55:37 +0200 |
| commit | f4aa29fb1e5536b675895f5a3bd6ce595af91f75 (patch) | |
| tree | 94ea06422231662dc80ebafe44a28ab537cdd87a | |
| parent | dc1c1fe45602acc2ec93d09c0cfb1a34cf291ecf (diff) | |
| parent | 870b47fee4f0986f033f8bdede46a63242c61df0 (diff) | |
| download | rust-f4aa29fb1e5536b675895f5a3bd6ce595af91f75.tar.gz rust-f4aa29fb1e5536b675895f5a3bd6ce595af91f75.zip | |
Rollup merge of #64930 - davidtwco:issue-61798-diverging-await, r=petrochenkov
Silence unreachable code lint from await desugaring Fixes #61798. This PR silences the unreachable code lint when it originates from within an await desugaring.
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/async-await/unreachable-lint-1.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/async-await/unreachable-lint-1.stderr | 16 | ||||
| -rw-r--r-- | src/test/ui/async-await/unreachable-lint.rs | 13 |
4 files changed, 43 insertions, 1 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 5e3db1c7990..be5723959fb 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -2364,7 +2364,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // which diverges, that we are about to lint on. This gives suboptimal diagnostics. // Instead, stop here so that the `if`- or `while`-expression's block is linted instead. if !span.is_desugaring(DesugaringKind::CondTemporary) && - !span.is_desugaring(DesugaringKind::Async) + !span.is_desugaring(DesugaringKind::Async) && + !orig_span.is_desugaring(DesugaringKind::Await) { self.diverges.set(Diverges::WarnedAlways); diff --git a/src/test/ui/async-await/unreachable-lint-1.rs b/src/test/ui/async-await/unreachable-lint-1.rs new file mode 100644 index 00000000000..d63d643c4e7 --- /dev/null +++ b/src/test/ui/async-await/unreachable-lint-1.rs @@ -0,0 +1,12 @@ +// edition:2018 +#![deny(unreachable_code)] + +async fn foo() { + return; bar().await; + //~^ ERROR unreachable statement +} + +async fn bar() { +} + +fn main() { } diff --git a/src/test/ui/async-await/unreachable-lint-1.stderr b/src/test/ui/async-await/unreachable-lint-1.stderr new file mode 100644 index 00000000000..382581bf945 --- /dev/null +++ b/src/test/ui/async-await/unreachable-lint-1.stderr @@ -0,0 +1,16 @@ +error: unreachable statement + --> $DIR/unreachable-lint-1.rs:5:13 + | +LL | return; bar().await; + | ------ ^^^^^^^^^^^^ unreachable statement + | | + | any code following this expression is unreachable + | +note: lint level defined here + --> $DIR/unreachable-lint-1.rs:2:9 + | +LL | #![deny(unreachable_code)] + | ^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/async-await/unreachable-lint.rs b/src/test/ui/async-await/unreachable-lint.rs new file mode 100644 index 00000000000..ca18cfde4f2 --- /dev/null +++ b/src/test/ui/async-await/unreachable-lint.rs @@ -0,0 +1,13 @@ +// check-pass +// edition:2018 +#![deny(unreachable_code)] + +async fn foo() { + endless().await; +} + +async fn endless() -> ! { + loop {} +} + +fn main() { } |
