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>
78 lines
2.6 KiB
Plaintext
78 lines
2.6 KiB
Plaintext
error[E0277]: the `?` operator can only be applied to values that implement `Try`
|
|
--> $DIR/issue-61076.rs:42:5
|
|
|
|
|
LL | foo()?;
|
|
| ^^^^^^ the `?` operator cannot be applied to type `impl Future<Output = Result<(), ()>>`
|
|
|
|
|
= help: the trait `Try` is not implemented for `impl Future<Output = Result<(), ()>>`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | foo().await?;
|
|
| ++++++
|
|
|
|
error[E0277]: the `?` operator can only be applied to values that implement `Try`
|
|
--> $DIR/issue-61076.rs:62:5
|
|
|
|
|
LL | t?;
|
|
| ^^ the `?` operator cannot be applied to type `T`
|
|
|
|
|
= help: the trait `Try` is not implemented for `T`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | t.await?;
|
|
| ++++++
|
|
|
|
error[E0609]: no field `0` on type `impl Future<Output = Tuple>`
|
|
--> $DIR/issue-61076.rs:71:26
|
|
|
|
|
LL | let _: i32 = tuple().0;
|
|
| ^ field not available in `impl Future`, but it is available in its `Output`
|
|
|
|
|
help: consider `await`ing on the `Future` and access the field of its `Output`
|
|
|
|
|
LL | let _: i32 = tuple().await.0;
|
|
| ++++++
|
|
|
|
error[E0609]: no field `a` on type `impl Future<Output = Struct>`
|
|
--> $DIR/issue-61076.rs:75:28
|
|
|
|
|
LL | let _: i32 = struct_().a;
|
|
| ^ field not available in `impl Future`, but it is available in its `Output`
|
|
|
|
|
help: consider `await`ing on the `Future` and access the field of its `Output`
|
|
|
|
|
LL | let _: i32 = struct_().await.a;
|
|
| ++++++
|
|
|
|
error[E0599]: no method named `method` found for opaque type `impl Future<Output = Struct>` in the current scope
|
|
--> $DIR/issue-61076.rs:79:15
|
|
|
|
|
LL | struct_().method();
|
|
| ^^^^^^ method not found in `impl Future<Output = Struct>`
|
|
|
|
|
help: consider `await`ing on the `Future` and calling the method on its `Output`
|
|
|
|
|
LL | struct_().await.method();
|
|
| ++++++
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/issue-61076.rs:88:9
|
|
|
|
|
LL | match tuple() {
|
|
| ------- this expression has type `impl Future<Output = Tuple>`
|
|
LL |
|
|
LL | Tuple(_) => {}
|
|
| ^^^^^^^^ expected future, found `Tuple`
|
|
|
|
|
= note: expected opaque type `impl Future<Output = Tuple>`
|
|
found struct `Tuple`
|
|
help: consider `await`ing on the `Future`
|
|
|
|
|
LL | match tuple().await {
|
|
| ++++++
|
|
|
|
error: aborting due to 6 previous errors
|
|
|
|
Some errors have detailed explanations: E0277, E0308, E0599, E0609.
|
|
For more information about an error, try `rustc --explain E0277`.
|