about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Wood <david@davidtw.co>2019-09-30 21:27:18 +0100
committerDavid Wood <david@davidtw.co>2019-09-30 21:27:18 +0100
commit870b47fee4f0986f033f8bdede46a63242c61df0 (patch)
tree4e11cb94f0b154cf45b756e5be687c9cf992dee4
parent22bc9e1d9ca49ee4f5cd953088ab09c238a6dd26 (diff)
downloadrust-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.rs3
-rw-r--r--src/test/ui/async-await/unreachable-lint-1.rs12
-rw-r--r--src/test/ui/async-await/unreachable-lint-1.stderr16
-rw-r--r--src/test/ui/async-await/unreachable-lint.rs13
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() { }