rust/tests/ui/async-await/issue-61076.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

95 lines
2.6 KiB
Rust
Raw Normal View History

2020-05-06 10:43:56 +00:00
//@ edition:2018
2020-05-14 15:07:46 +00:00
use core::future::Future;
use core::pin::Pin;
use core::task::{Context, Poll};
struct T;
2020-08-16 12:25:22 +00:00
struct Tuple(i32);
2020-05-30 14:57:12 +00:00
struct Struct {
a: i32
}
2020-08-20 07:34:08 +00:00
impl Struct {
fn method(&self) {}
}
2020-08-16 12:25:22 +00:00
impl Future for Struct {
type Output = Struct;
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> { Poll::Pending }
}
impl Future for Tuple {
type Output = Tuple;
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> { Poll::Pending }
2020-05-30 14:57:12 +00:00
}
2020-05-14 15:07:46 +00:00
impl Future for T {
type Output = Result<(), ()>;
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> {
Poll::Pending
}
}
2020-05-06 10:43:56 +00:00
async fn foo() -> Result<(), ()> {
Ok(())
}
async fn bar() -> Result<(), ()> {
foo()?; //~ ERROR the `?` operator can only be applied to values that implement `Try`
2021-11-17 00:16:23 +00:00
//~^ NOTE 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`
//~| NOTE in this expansion of desugaring of operator `?`
//~| NOTE in this expansion of desugaring of operator `?`
//~| NOTE in this expansion of desugaring of operator `?`
2020-05-06 10:43:56 +00:00
Ok(())
}
2020-08-16 12:25:22 +00:00
async fn struct_() -> Struct {
Struct { a: 1 }
}
async fn tuple() -> Tuple {
Tuple(1i32)
}
2020-05-14 15:07:46 +00:00
async fn baz() -> Result<(), ()> {
let t = T;
t?; //~ ERROR the `?` operator can only be applied to values that implement `Try`
//~^ NOTE the `?` operator cannot be applied to type `T`
//~| HELP the trait `Try` is not implemented for `T`
//~| HELP consider `await`ing on the `Future`
//~| NOTE in this expansion of desugaring of operator `?`
//~| NOTE in this expansion of desugaring of operator `?`
//~| NOTE in this expansion of desugaring of operator `?`
2020-05-30 14:57:12 +00:00
2020-08-16 12:25:22 +00:00
let _: i32 = tuple().0; //~ ERROR no field `0`
//~^ HELP consider `await`ing on the `Future`
//~| NOTE field not available in `impl Future`
2020-05-30 14:57:12 +00:00
2020-08-16 12:25:22 +00:00
let _: i32 = struct_().a; //~ ERROR no field `a`
//~^ HELP consider `await`ing on the `Future`
//~| NOTE field not available in `impl Future`
2020-05-30 14:57:12 +00:00
2020-08-20 07:34:08 +00:00
struct_().method(); //~ ERROR no method named
2021-11-17 00:16:23 +00:00
//~^ NOTE method not found in `impl Future<Output = Struct>`
//~| HELP consider `await`ing on the `Future`
2020-05-14 15:07:46 +00:00
Ok(())
}
2020-08-20 10:42:08 +00:00
async fn match_() {
match tuple() { //~ HELP consider `await`ing on the `Future`
//~^ NOTE this expression has type `impl Future<Output = Tuple>`
2020-08-20 10:42:08 +00:00
Tuple(_) => {} //~ ERROR mismatched types
fix: improve the suggestion on future not awaited 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>
2023-02-10 18:03:54 +00:00
//~^ NOTE expected future, found `Tuple`
2021-11-17 00:16:23 +00:00
//~| NOTE expected opaque type `impl Future<Output = Tuple>`
2020-08-20 10:42:08 +00:00
}
}
2020-05-30 14:57:12 +00:00
2020-05-06 10:43:56 +00:00
fn main() {}