]> git.proxmox.com Git - rustc.git/blame - src/test/ui/async-await/issue-68112.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / src / test / ui / async-await / issue-68112.rs
CommitLineData
ba9703b0
XL
1// edition:2018
2
3use std::{
4 future::Future,
5 cell::RefCell,
6 sync::Arc,
7 pin::Pin,
8 task::{Context, Poll},
9};
10
11fn require_send(_: impl Send) {}
12
13struct Ready<T>(Option<T>);
14impl<T> Future for Ready<T> {
15 type Output = T;
16 fn poll(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<T> {
17 Poll::Ready(self.0.take().unwrap())
18 }
19}
20fn ready<T>(t: T) -> Ready<T> {
21 Ready(Some(t))
22}
23
24fn make_non_send_future1() -> impl Future<Output = Arc<RefCell<i32>>> {
25 ready(Arc::new(RefCell::new(0)))
26}
27
28fn test1() {
29 let send_fut = async {
30 let non_send_fut = make_non_send_future1();
31 let _ = non_send_fut.await;
32 ready(0).await;
33 };
34 require_send(send_fut);
35 //~^ ERROR future cannot be sent between threads
36}
37
38fn test1_no_let() {
39 let send_fut = async {
40 let _ = make_non_send_future1().await;
41 ready(0).await;
42 };
43 require_send(send_fut);
44 //~^ ERROR future cannot be sent between threads
45}
46
47async fn ready2<T>(t: T) -> T { t }
48fn make_non_send_future2() -> impl Future<Output = Arc<RefCell<i32>>> {
49 ready2(Arc::new(RefCell::new(0)))
50}
51
52// Ideally this test would have diagnostics similar to the test above, but right
53// now it doesn't.
54fn test2() {
55 let send_fut = async {
56 let non_send_fut = make_non_send_future2();
57 let _ = non_send_fut.await;
58 ready(0).await;
59 };
60 require_send(send_fut);
1b1a35ee 61 //~^ ERROR `RefCell<i32>` cannot be shared between threads safely
ba9703b0
XL
62}
63
64fn main() {}