]> git.proxmox.com Git - rustc.git/blob - tests/ui/async-await/issue-61076.rs
New upstream version 1.69.0+dfsg1
[rustc.git] / tests / ui / async-await / issue-61076.rs
1 // edition:2018
2
3 use core::future::Future;
4 use core::pin::Pin;
5 use core::task::{Context, Poll};
6
7 struct T;
8
9 struct Tuple(i32);
10
11 struct Struct {
12 a: i32
13 }
14
15 impl Struct {
16 fn method(&self) {}
17 }
18
19 impl Future for Struct {
20 type Output = Struct;
21 fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> { Poll::Pending }
22 }
23
24 impl Future for Tuple {
25 type Output = Tuple;
26 fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> { Poll::Pending }
27 }
28
29 impl Future for T {
30 type Output = Result<(), ()>;
31
32 fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> {
33 Poll::Pending
34 }
35 }
36
37 async fn foo() -> Result<(), ()> {
38 Ok(())
39 }
40
41 async fn bar() -> Result<(), ()> {
42 foo()?; //~ ERROR the `?` operator can only be applied to values that implement `Try`
43 //~^ NOTE the `?` operator cannot be applied to type `impl Future<Output = Result<(), ()>>`
44 //~| HELP the trait `Try` is not implemented for `impl Future<Output = Result<(), ()>>`
45 //~| HELP consider `await`ing on the `Future`
46 //~| NOTE in this expansion of desugaring of operator `?`
47 //~| NOTE in this expansion of desugaring of operator `?`
48 //~| NOTE in this expansion of desugaring of operator `?`
49 Ok(())
50 }
51
52 async fn struct_() -> Struct {
53 Struct { a: 1 }
54 }
55
56 async fn tuple() -> Tuple {
57 Tuple(1i32)
58 }
59
60 async fn baz() -> Result<(), ()> {
61 let t = T;
62 t?; //~ ERROR the `?` operator can only be applied to values that implement `Try`
63 //~^ NOTE the `?` operator cannot be applied to type `T`
64 //~| HELP the trait `Try` is not implemented for `T`
65 //~| HELP consider `await`ing on the `Future`
66 //~| NOTE in this expansion of desugaring of operator `?`
67 //~| NOTE in this expansion of desugaring of operator `?`
68 //~| NOTE in this expansion of desugaring of operator `?`
69
70
71 let _: i32 = tuple().0; //~ ERROR no field `0`
72 //~^ HELP consider `await`ing on the `Future`
73 //~| NOTE field not available in `impl Future`
74
75 let _: i32 = struct_().a; //~ ERROR no field `a`
76 //~^ HELP consider `await`ing on the `Future`
77 //~| NOTE field not available in `impl Future`
78
79 struct_().method(); //~ ERROR no method named
80 //~^ NOTE method not found in `impl Future<Output = Struct>`
81 //~| HELP consider `await`ing on the `Future`
82 Ok(())
83 }
84
85 async fn match_() {
86 match tuple() { //~ HELP consider `await`ing on the `Future`
87 //~^ NOTE this expression has type `impl Future<Output = Tuple>`
88 Tuple(_) => {} //~ ERROR mismatched types
89 //~^ NOTE expected future, found `Tuple`
90 //~| NOTE expected opaque type `impl Future<Output = Tuple>`
91 }
92 }
93
94 fn main() {}