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.

98 lines
2.9 KiB
Rust
Raw Normal View History

2020-05-06 05:43:56 -05:00
// edition:2018
2020-05-14 10:07:46 -05:00
use core::future::Future;
use core::pin::Pin;
use core::task::{Context, Poll};
struct T;
2020-08-16 07:25:22 -05:00
struct Tuple(i32);
2020-05-30 09:57:12 -05:00
struct Struct {
a: i32
}
2020-08-20 02:34:08 -05:00
impl Struct {
fn method(&self) {}
}
2020-08-16 07:25:22 -05: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 09:57:12 -05:00
}
2020-05-14 10:07:46 -05:00
impl Future for T {
type Output = Result<(), ()>;
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> {
Poll::Pending
}
}
2020-05-06 05:43:56 -05: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-16 18:16:23 -06: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 05:43:56 -05:00
Ok(())
}
2020-08-16 07:25:22 -05:00
async fn struct_() -> Struct {
Struct { a: 1 }
}
async fn tuple() -> Tuple {
//~^ NOTE checked the `Output` of this `async fn`, expected opaque type
2021-07-31 14:20:00 -05:00
//~| NOTE while checking the return type of the `async fn`
//~| NOTE in this expansion of desugaring of `async` block or function
2020-08-16 07:25:22 -05:00
Tuple(1i32)
}
2020-05-14 10:07:46 -05: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 09:57:12 -05:00
2020-08-16 07:25:22 -05: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 09:57:12 -05:00
2020-08-16 07:25:22 -05: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 09:57:12 -05:00
2020-08-20 02:34:08 -05:00
struct_().method(); //~ ERROR no method named
2021-11-16 18:16:23 -06:00
//~^ NOTE method not found in `impl Future<Output = Struct>`
//~| HELP consider `await`ing on the `Future`
2020-05-14 10:07:46 -05:00
Ok(())
}
2020-08-20 05:42:08 -05: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 05:42:08 -05:00
Tuple(_) => {} //~ ERROR mismatched types
//~^ NOTE expected opaque type, found struct `Tuple`
2021-11-16 18:16:23 -06:00
//~| NOTE expected opaque type `impl Future<Output = Tuple>`
2020-08-20 05:42:08 -05:00
}
}
2020-05-30 09:57:12 -05:00
2020-05-06 05:43:56 -05:00
fn main() {}