mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 17:24:06 +00:00
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>
61 lines
1.8 KiB
Rust
61 lines
1.8 KiB
Rust
// edition:2018
|
|
|
|
fn dummy() -> i32 {
|
|
42
|
|
}
|
|
|
|
fn extra_semicolon() {
|
|
let _ = if true {
|
|
//~^ NOTE `if` and `else` have incompatible types
|
|
dummy(); //~ NOTE expected because of this
|
|
//~^ HELP consider removing this semicolon
|
|
} else {
|
|
dummy() //~ ERROR `if` and `else` have incompatible types
|
|
//~^ NOTE expected `()`, found `i32`
|
|
};
|
|
}
|
|
|
|
async fn async_dummy() {}
|
|
|
|
async fn async_dummy2() {}
|
|
|
|
async fn async_extra_semicolon_same() {
|
|
let _ = if true {
|
|
//~^ NOTE `if` and `else` have incompatible types
|
|
async_dummy(); //~ NOTE expected because of this
|
|
//~^ HELP consider removing this semicolon
|
|
} else {
|
|
async_dummy() //~ ERROR `if` and `else` have incompatible types
|
|
//~^ NOTE expected `()`, found future
|
|
//~| NOTE calling an async function returns a future
|
|
//~| HELP consider `await`ing on the `Future`
|
|
};
|
|
}
|
|
|
|
async fn async_extra_semicolon_different() {
|
|
let _ = if true {
|
|
//~^ NOTE `if` and `else` have incompatible types
|
|
async_dummy(); //~ NOTE expected because of this
|
|
//~^ HELP consider removing this semicolon
|
|
} else {
|
|
async_dummy2() //~ ERROR `if` and `else` have incompatible types
|
|
//~^ NOTE expected `()`, found future
|
|
//~| NOTE calling an async function returns a future
|
|
//~| HELP consider `await`ing on the `Future`
|
|
};
|
|
}
|
|
|
|
async fn async_different_futures() {
|
|
let _ = if true {
|
|
//~^ NOTE `if` and `else` have incompatible types
|
|
async_dummy() //~ NOTE expected because of this
|
|
//~| HELP consider `await`ing on both `Future`s
|
|
} else {
|
|
async_dummy2() //~ ERROR `if` and `else` have incompatible types
|
|
//~^ NOTE expected future, found a different future
|
|
//~| NOTE distinct uses of `impl Trait` result in different opaque types
|
|
};
|
|
}
|
|
|
|
fn main() {}
|