diff options
| author | David Wood <david@davidtw.co> | 2019-09-30 21:27:18 +0100 |
|---|---|---|
| committer | David Wood <david@davidtw.co> | 2019-09-30 21:27:18 +0100 |
| commit | 870b47fee4f0986f033f8bdede46a63242c61df0 (patch) | |
| tree | 4e11cb94f0b154cf45b756e5be687c9cf992dee4 | |
| parent | 22bc9e1d9ca49ee4f5cd953088ab09c238a6dd26 (diff) | |
| download | rust-870b47fee4f0986f033f8bdede46a63242c61df0.tar.gz rust-870b47fee4f0986f033f8bdede46a63242c61df0.zip | |
typeck: silence unreachable code from await
This commit silences the unreachable code lint when it originates from within a await desugaring. Signed-off-by: David Wood <david@davidtw.co>
| -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() { } |
