Skip to content

Commit 9bcc107

Browse files
committed
Update async-await-let-else for drop tracking
1 parent c84083b commit 9bcc107

File tree

3 files changed

+130
-17
lines changed

3 files changed

+130
-17
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
error: future cannot be sent between threads safely
2+
--> $DIR/async-await-let-else.rs:48:13
3+
|
4+
LL | is_send(foo(Some(true)));
5+
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
6+
|
7+
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
8+
note: future is not `Send` as this value is used across an await
9+
--> $DIR/async-await-let-else.rs:11:14
10+
|
11+
LL | let r = Rc::new(());
12+
| - has type `Rc<()>` which is not `Send`
13+
LL | bar().await
14+
| ^^^^^^ await occurs here, with `r` maybe used later
15+
LL | };
16+
| - `r` is later dropped here
17+
note: required by a bound in `is_send`
18+
--> $DIR/async-await-let-else.rs:19:15
19+
|
20+
LL | fn is_send<T: Send>(_: T) {}
21+
| ^^^^ required by this bound in `is_send`
22+
23+
error[E0277]: `Rc<()>` cannot be sent between threads safely
24+
--> $DIR/async-await-let-else.rs:50:13
25+
|
26+
LL | async fn foo2(x: Option<bool>) {
27+
| - within this `impl Future<Output = ()>`
28+
...
29+
LL | is_send(foo2(Some(true)));
30+
| ------- ^^^^^^^^^^^^^^^^ `Rc<()>` cannot be sent between threads safely
31+
| |
32+
| required by a bound introduced by this call
33+
|
34+
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
35+
note: required because it's used within this `async fn` body
36+
--> $DIR/async-await-let-else.rs:27:29
37+
|
38+
LL | async fn bar2<T>(_: T) -> ! {
39+
| _____________________________^
40+
LL | | panic!()
41+
LL | | }
42+
| |_^
43+
= note: required because it captures the following types: `ResumeTy`, `Option<bool>`, `impl Future<Output = !>`, `()`
44+
note: required because it's used within this `async fn` body
45+
--> $DIR/async-await-let-else.rs:21:32
46+
|
47+
LL | async fn foo2(x: Option<bool>) {
48+
| ________________________________^
49+
LL | | let Some(_) = x else {
50+
LL | | bar2(Rc::new(())).await
51+
LL | | };
52+
LL | | }
53+
| |_^
54+
note: required by a bound in `is_send`
55+
--> $DIR/async-await-let-else.rs:19:15
56+
|
57+
LL | fn is_send<T: Send>(_: T) {}
58+
| ^^^^ required by this bound in `is_send`
59+
60+
error: future cannot be sent between threads safely
61+
--> $DIR/async-await-let-else.rs:52:13
62+
|
63+
LL | is_send(foo3(Some(true)));
64+
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
65+
|
66+
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
67+
note: future is not `Send` as this value is used across an await
68+
--> $DIR/async-await-let-else.rs:33:28
69+
|
70+
LL | (Rc::new(()), bar().await);
71+
| ----------- ^^^^^^ await occurs here, with `Rc::new(())` maybe used later
72+
| |
73+
| has type `Rc<()>` which is not `Send`
74+
note: `Rc::new(())` is later dropped here
75+
--> $DIR/async-await-let-else.rs:33:35
76+
|
77+
LL | (Rc::new(()), bar().await);
78+
| ^
79+
note: required by a bound in `is_send`
80+
--> $DIR/async-await-let-else.rs:19:15
81+
|
82+
LL | fn is_send<T: Send>(_: T) {}
83+
| ^^^^ required by this bound in `is_send`
84+
85+
error: future cannot be sent between threads safely
86+
--> $DIR/async-await-let-else.rs:54:13
87+
|
88+
LL | is_send(foo4(Some(true)));
89+
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
90+
|
91+
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
92+
note: future is not `Send` as this value is used across an await
93+
--> $DIR/async-await-let-else.rs:41:14
94+
|
95+
LL | let r = Rc::new(());
96+
| - has type `Rc<()>` which is not `Send`
97+
LL | bar().await;
98+
| ^^^^^^ await occurs here, with `r` maybe used later
99+
...
100+
LL | };
101+
| - `r` is later dropped here
102+
note: required by a bound in `is_send`
103+
--> $DIR/async-await-let-else.rs:19:15
104+
|
105+
LL | fn is_send<T: Send>(_: T) {}
106+
| ^^^^ required by this bound in `is_send`
107+
108+
error: aborting due to 4 previous errors
109+
110+
For more information about this error, try `rustc --explain E0277`.

src/test/ui/async-await/async-await-let-else.stderr renamed to src/test/ui/async-await/async-await-let-else.no-drop-tracking.stderr

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
error: future cannot be sent between threads safely
2-
--> $DIR/async-await-let-else.rs:45:13
2+
--> $DIR/async-await-let-else.rs:48:13
33
|
44
LL | is_send(foo(Some(true)));
55
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
66
|
77
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
88
note: future is not `Send` as this value is used across an await
9-
--> $DIR/async-await-let-else.rs:8:14
9+
--> $DIR/async-await-let-else.rs:11:14
1010
|
1111
LL | let r = Rc::new(());
1212
| - has type `Rc<()>` which is not `Send`
@@ -15,20 +15,20 @@ LL | bar().await
1515
LL | };
1616
| - `r` is later dropped here
1717
note: required by a bound in `is_send`
18-
--> $DIR/async-await-let-else.rs:16:15
18+
--> $DIR/async-await-let-else.rs:19:15
1919
|
2020
LL | fn is_send<T: Send>(_: T) {}
2121
| ^^^^ required by this bound in `is_send`
2222

2323
error: future cannot be sent between threads safely
24-
--> $DIR/async-await-let-else.rs:47:13
24+
--> $DIR/async-await-let-else.rs:50:13
2525
|
2626
LL | is_send(foo2(Some(true)));
2727
| ^^^^^^^^^^^^^^^^ future returned by `foo2` is not `Send`
2828
|
2929
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
3030
note: future is not `Send` as this value is used across an await
31-
--> $DIR/async-await-let-else.rs:20:26
31+
--> $DIR/async-await-let-else.rs:23:26
3232
|
3333
LL | bar2(Rc::new(())).await
3434
| ----------- ^^^^^^ await occurs here, with `Rc::new(())` maybe used later
@@ -37,45 +37,45 @@ LL | bar2(Rc::new(())).await
3737
LL | };
3838
| - `Rc::new(())` is later dropped here
3939
note: required by a bound in `is_send`
40-
--> $DIR/async-await-let-else.rs:16:15
40+
--> $DIR/async-await-let-else.rs:19:15
4141
|
4242
LL | fn is_send<T: Send>(_: T) {}
4343
| ^^^^ required by this bound in `is_send`
4444

4545
error: future cannot be sent between threads safely
46-
--> $DIR/async-await-let-else.rs:49:13
46+
--> $DIR/async-await-let-else.rs:52:13
4747
|
4848
LL | is_send(foo3(Some(true)));
4949
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
5050
|
5151
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
5252
note: future is not `Send` as this value is used across an await
53-
--> $DIR/async-await-let-else.rs:30:28
53+
--> $DIR/async-await-let-else.rs:33:28
5454
|
5555
LL | (Rc::new(()), bar().await);
5656
| ----------- ^^^^^^ await occurs here, with `Rc::new(())` maybe used later
5757
| |
5858
| has type `Rc<()>` which is not `Send`
5959
note: `Rc::new(())` is later dropped here
60-
--> $DIR/async-await-let-else.rs:30:35
60+
--> $DIR/async-await-let-else.rs:33:35
6161
|
6262
LL | (Rc::new(()), bar().await);
6363
| ^
6464
note: required by a bound in `is_send`
65-
--> $DIR/async-await-let-else.rs:16:15
65+
--> $DIR/async-await-let-else.rs:19:15
6666
|
6767
LL | fn is_send<T: Send>(_: T) {}
6868
| ^^^^ required by this bound in `is_send`
6969

7070
error: future cannot be sent between threads safely
71-
--> $DIR/async-await-let-else.rs:51:13
71+
--> $DIR/async-await-let-else.rs:54:13
7272
|
7373
LL | is_send(foo4(Some(true)));
7474
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
7575
|
7676
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
7777
note: future is not `Send` as this value is used across an await
78-
--> $DIR/async-await-let-else.rs:38:14
78+
--> $DIR/async-await-let-else.rs:41:14
7979
|
8080
LL | let r = Rc::new(());
8181
| - has type `Rc<()>` which is not `Send`
@@ -85,7 +85,7 @@ LL | bar().await;
8585
LL | };
8686
| - `r` is later dropped here
8787
note: required by a bound in `is_send`
88-
--> $DIR/async-await-let-else.rs:16:15
88+
--> $DIR/async-await-let-else.rs:19:15
8989
|
9090
LL | fn is_send<T: Send>(_: T) {}
9191
| ^^^^ required by this bound in `is_send`

src/test/ui/async-await/async-await-let-else.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
// edition:2021
2+
// revisions: drop-tracking no-drop-tracking
3+
// [drop-tracking] compile-flags: -Zdrop-tracking=yes
4+
// [no-drop-tracking] compile-flags: -Zdrop-tracking=no
25
#![feature(let_else)]
36
use std::rc::Rc;
47

@@ -43,11 +46,11 @@ async fn foo4(x: Option<bool>) {
4346

4447
fn main() {
4548
is_send(foo(Some(true)));
46-
//~^ ERROR future cannot be sent between threads safely
49+
//~^ ERROR cannot be sent between threads safely
4750
is_send(foo2(Some(true)));
48-
//~^ ERROR future cannot be sent between threads safely
51+
//~^ ERROR cannot be sent between threads safely
4952
is_send(foo3(Some(true)));
50-
//~^ ERROR future cannot be sent between threads safely
53+
//~^ ERROR cannot be sent between threads safely
5154
is_send(foo4(Some(true)));
52-
//~^ ERROR future cannot be sent between threads safely
55+
//~^ ERROR cannot be sent between threads safely
5356
}

0 commit comments

Comments
 (0)