summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-06-27 23:01:01 +0200
committerGitHub <noreply@github.com>2019-06-27 23:01:01 +0200
commitdf97fc6038c648ce7396d3f4dde6f6d783aec1ba (patch)
tree7a86dc790708086050272878dcfed6efa7741f4e /src/test
parent2f6cf36b326d5045872785782cdd0c121a3198ec (diff)
parent88194200e57c90ba0fa7b725d63ff4de28e71bbb (diff)
downloadrust-df97fc6038c648ce7396d3f4dde6f6d783aec1ba.tar.gz
rust-df97fc6038c648ce7396d3f4dde6f6d783aec1ba.zip
Rollup merge of #62067 - doctorn:await_diagnostic, r=matthewjasper
Add suggestion for missing `.await` keyword

This commit adds a suggestion diagnostic for missing `.await`. In order to do this, the trait `Future` is promoted to a lang item.

Compiling code of the form:

```rust
#![feature(async_await)]

fn take_u32(x: u32) {}

async fn make_u32() -> u32 {
    22
}

async fn foo() {
    let x = make_u32();
    take_u32(x)
}

fn main() {}
```

Will now result in the suggestion:

```
error[E0308]: mismatched types
  --> src/main.rs:11:18
   |
11 |         take_u32(x)
   |                  ^
   |                  |
   |                  expected u32, found opaque type
   |                  help: consider using `.await` here: `x.await`
   |
   = note: expected type `u32`
              found type `impl std::future::Future`
```

This commit does not cover chained expressions and therefore only covers the case originally pointed out in #61076. Cases I can think of that still need to be covered:

- [ ] Return places for functions
- [ ] Field access
- [ ] Method invocation

I'm planning to submit PRs for each of these separately as and when I have figured them out.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/async-await/dont-suggest-missing-await.rs21
-rw-r--r--src/test/ui/async-await/dont-suggest-missing-await.stderr12
-rw-r--r--src/test/ui/async-await/suggest-missing-await.fixed32
-rw-r--r--src/test/ui/async-await/suggest-missing-await.rs32
-rw-r--r--src/test/ui/async-await/suggest-missing-await.stderr27
5 files changed, 124 insertions, 0 deletions
diff --git a/src/test/ui/async-await/dont-suggest-missing-await.rs b/src/test/ui/async-await/dont-suggest-missing-await.rs
new file mode 100644
index 00000000000..d551ef57985
--- /dev/null
+++ b/src/test/ui/async-await/dont-suggest-missing-await.rs
@@ -0,0 +1,21 @@
+// edition:2018
+
+// This test ensures we don't make the suggestion in bodies that aren't `async`.
+
+#![feature(async_await)]
+
+fn take_u32(x: u32) {}
+
+async fn make_u32() -> u32 {
+    22
+}
+
+async fn dont_suggest_await_in_closure() {
+    || {
+        let x = make_u32();
+        take_u32(x)
+        //~^ ERROR mismatched types [E0308]
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/async-await/dont-suggest-missing-await.stderr b/src/test/ui/async-await/dont-suggest-missing-await.stderr
new file mode 100644
index 00000000000..c60b0d1f30e
--- /dev/null
+++ b/src/test/ui/async-await/dont-suggest-missing-await.stderr
@@ -0,0 +1,12 @@
+error[E0308]: mismatched types
+  --> $DIR/dont-suggest-missing-await.rs:16:18
+   |
+LL |         take_u32(x)
+   |                  ^ expected u32, found opaque type
+   |
+   = note: expected type `u32`
+              found type `impl std::future::Future`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/async-await/suggest-missing-await.fixed b/src/test/ui/async-await/suggest-missing-await.fixed
new file mode 100644
index 00000000000..282be368c69
--- /dev/null
+++ b/src/test/ui/async-await/suggest-missing-await.fixed
@@ -0,0 +1,32 @@
+// edition:2018
+// run-rustfix
+
+#![feature(async_await)]
+
+fn take_u32(_x: u32) {}
+
+async fn make_u32() -> u32 {
+    22
+}
+
+#[allow(unused)]
+async fn suggest_await_in_async_fn() {
+    let x = make_u32();
+    take_u32(x.await)
+    //~^ ERROR mismatched types [E0308]
+    //~| HELP consider using `.await` here
+    //~| SUGGESTION x.await
+}
+
+#[allow(unused)]
+async fn suggest_await_in_async_closure() {
+    async || {
+        let x = make_u32();
+        take_u32(x.await)
+        //~^ ERROR mismatched types [E0308]
+        //~| HELP consider using `.await` here
+        //~| SUGGESTION x.await
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/async-await/suggest-missing-await.rs b/src/test/ui/async-await/suggest-missing-await.rs
new file mode 100644
index 00000000000..36103f050c1
--- /dev/null
+++ b/src/test/ui/async-await/suggest-missing-await.rs
@@ -0,0 +1,32 @@
+// edition:2018
+// run-rustfix
+
+#![feature(async_await)]
+
+fn take_u32(_x: u32) {}
+
+async fn make_u32() -> u32 {
+    22
+}
+
+#[allow(unused)]
+async fn suggest_await_in_async_fn() {
+    let x = make_u32();
+    take_u32(x)
+    //~^ ERROR mismatched types [E0308]
+    //~| HELP consider using `.await` here
+    //~| SUGGESTION x.await
+}
+
+#[allow(unused)]
+async fn suggest_await_in_async_closure() {
+    async || {
+        let x = make_u32();
+        take_u32(x)
+        //~^ ERROR mismatched types [E0308]
+        //~| HELP consider using `.await` here
+        //~| SUGGESTION x.await
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/async-await/suggest-missing-await.stderr b/src/test/ui/async-await/suggest-missing-await.stderr
new file mode 100644
index 00000000000..59c20dcfbc9
--- /dev/null
+++ b/src/test/ui/async-await/suggest-missing-await.stderr
@@ -0,0 +1,27 @@
+error[E0308]: mismatched types
+  --> $DIR/suggest-missing-await.rs:15:14
+   |
+LL |     take_u32(x)
+   |              ^
+   |              |
+   |              expected u32, found opaque type
+   |              help: consider using `.await` here: `x.await`
+   |
+   = note: expected type `u32`
+              found type `impl std::future::Future`
+
+error[E0308]: mismatched types
+  --> $DIR/suggest-missing-await.rs:25:18
+   |
+LL |         take_u32(x)
+   |                  ^
+   |                  |
+   |                  expected u32, found opaque type
+   |                  help: consider using `.await` here: `x.await`
+   |
+   = note: expected type `u32`
+              found type `impl std::future::Future`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.