2bdc9a046a
Considering the following code ```rust fn foo() -> u8 { async fn async_fn() -> u8 { 22 } async_fn() } fn main() {} ``` the error generated before this commit from the compiler is ``` ➜ rust git:(macros/async_fn_suggestion) ✗ rustc test.rs --edition 2021 error[E0308]: mismatched types --> test.rs:4:5 | 1 | fn foo() -> u8 { | -- expected `u8` because of return type ... 4 | async_fn() | ^^^^^^^^^^ expected `u8`, found opaque type | = note: expected type `u8` found opaque type `impl Future<Output = u8>` help: consider `await`ing on the `Future` | 4 | async_fn().await | ++++++ error: aborting due to previous error ``` In this case the error is nor perfect, and can confuse the user that do not know that the opaque type is the future. So this commit will propose (and conclude the work start in https://github.com/rust-lang/rust/issues/80658) to change the string `opaque type` to `future` when applicable and also remove the Expected vs Received note by adding a more specific one regarding the async function that return a future type. So the new error emitted by the compiler is ``` error[E0308]: mismatched types --> test.rs:4:5 | 1 | fn foo() -> u8 { | -- expected `u8` because of return type ... 4 | async_fn() | ^^^^^^^^^^ expected `u8`, found future | note: calling an async function returns a future --> test.rs:4:5 | 4 | async_fn() | ^^^^^^^^^^ help: consider `await`ing on the `Future` | 4 | async_fn().await | ++++++ error: aborting due to previous error ``` Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
139 lines
4.0 KiB
Plaintext
139 lines
4.0 KiB
Plaintext
error[E0308]: mismatched types
|
|
--> $DIR/suggest-missing-await.rs:12:14
|
|
|
|
|
LL | take_u32(x)
|
|
| -------- ^ expected `u32`, found future
|
|
| |
|
|
| arguments to this function are incorrect
|
|
|
|
|
note: calling an async function returns a future
|
|
--> $DIR/suggest-missing-await.rs:12:14
|
|
|
|
|
LL | take_u32(x)
|
|
| ^
|
|
note: function defined here
|
|
--> $DIR/suggest-missing-await.rs:3:4
|
|
|
|
|
LL | fn take_u32(_x: u32) {}
|
|
| ^^^^^^^^ -------
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | take_u32(x.await)
|
|
| ++++++
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/suggest-missing-await.rs:22:5
|
|
|
|
|
LL | dummy()
|
|
| ^^^^^^^ expected `()`, found future
|
|
|
|
|
note: calling an async function returns a future
|
|
--> $DIR/suggest-missing-await.rs:22:5
|
|
|
|
|
LL | dummy()
|
|
| ^^^^^^^
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | dummy().await
|
|
| ++++++
|
|
help: consider using a semicolon here
|
|
|
|
|
LL | dummy();
|
|
| +
|
|
|
|
error[E0308]: `if` and `else` have incompatible types
|
|
--> $DIR/suggest-missing-await.rs:35:9
|
|
|
|
|
LL | let _x = if true {
|
|
| ______________-
|
|
LL | | dummy()
|
|
| | ------- expected because of this
|
|
LL | |
|
|
LL | | } else {
|
|
LL | | dummy().await
|
|
| | ^^^^^^^^^^^^^ expected future, found `()`
|
|
LL | |
|
|
LL | | };
|
|
| |_____- `if` and `else` have incompatible types
|
|
|
|
|
= note: expected opaque type `impl Future<Output = ()>`
|
|
found unit type `()`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | dummy().await
|
|
| ++++++
|
|
|
|
error[E0308]: `match` arms have incompatible types
|
|
--> $DIR/suggest-missing-await.rs:45:14
|
|
|
|
|
LL | let _x = match 0usize {
|
|
| ______________-
|
|
LL | | 0 => dummy(),
|
|
| | ------- this is found to be of type `impl Future<Output = ()>`
|
|
LL | | 1 => dummy(),
|
|
| | ------- this is found to be of type `impl Future<Output = ()>`
|
|
LL | | 2 => dummy().await,
|
|
| | ^^^^^^^^^^^^^ expected future, found `()`
|
|
LL | |
|
|
LL | | };
|
|
| |_____- `match` arms have incompatible types
|
|
|
|
|
= note: expected opaque type `impl Future<Output = ()>`
|
|
found unit type `()`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL ~ 0 => dummy().await,
|
|
LL ~ 1 => dummy().await,
|
|
|
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/suggest-missing-await.rs:53:9
|
|
|
|
|
LL | let _x = match dummy() {
|
|
| ------- this expression has type `impl Future<Output = ()>`
|
|
LL | () => {}
|
|
| ^^ expected future, found `()`
|
|
|
|
|
= note: expected opaque type `impl Future<Output = ()>`
|
|
found unit type `()`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | let _x = match dummy().await {
|
|
| ++++++
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/suggest-missing-await.rs:67:9
|
|
|
|
|
LL | match dummy_result() {
|
|
| -------------- this expression has type `impl Future<Output = Result<(), ()>>`
|
|
...
|
|
LL | Ok(_) => {}
|
|
| ^^^^^ expected future, found `Result<_, _>`
|
|
|
|
|
= note: expected opaque type `impl Future<Output = Result<(), ()>>`
|
|
found enum `Result<_, _>`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | match dummy_result().await {
|
|
| ++++++
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/suggest-missing-await.rs:69:9
|
|
|
|
|
LL | match dummy_result() {
|
|
| -------------- this expression has type `impl Future<Output = Result<(), ()>>`
|
|
...
|
|
LL | Err(_) => {}
|
|
| ^^^^^^ expected future, found `Result<_, _>`
|
|
|
|
|
= note: expected opaque type `impl Future<Output = Result<(), ()>>`
|
|
found enum `Result<_, _>`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | match dummy_result().await {
|
|
| ++++++
|
|
|
|
error: aborting due to 7 previous errors
|
|
|
|
For more information about this error, try `rustc --explain E0308`.
|