]>
Commit | Line | Data |
---|---|---|
ba9703b0 XL |
1 | #![feature(generators, generator_trait)] |
2 | ||
3 | use std::{ | |
4 | cell::RefCell, | |
5 | sync::Arc, | |
6 | pin::Pin, | |
7 | ops::{Generator, GeneratorState}, | |
8 | }; | |
9 | ||
10 | pub struct Ready<T>(Option<T>); | |
11 | impl<T> Generator<()> for Ready<T> { | |
12 | type Return = T; | |
13 | type Yield = (); | |
14 | fn resume(mut self: Pin<&mut Self>, _args: ()) -> GeneratorState<(), T> { | |
15 | GeneratorState::Complete(self.0.take().unwrap()) | |
16 | } | |
17 | } | |
18 | pub fn make_gen1<T>(t: T) -> Ready<T> { | |
19 | Ready(Some(t)) | |
20 | } | |
21 | ||
22 | fn require_send(_: impl Send) {} | |
923072b8 FG |
23 | //~^ NOTE required by a bound |
24 | //~| NOTE required by a bound | |
25 | //~| NOTE required by this bound | |
26 | //~| NOTE required by this bound | |
ba9703b0 XL |
27 | |
28 | fn make_non_send_generator() -> impl Generator<Return = Arc<RefCell<i32>>> { | |
29 | make_gen1(Arc::new(RefCell::new(0))) | |
30 | } | |
31 | ||
32 | fn test1() { | |
33 | let send_gen = || { | |
34 | let _non_send_gen = make_non_send_generator(); | |
923072b8 | 35 | //~^ NOTE not `Send` |
ba9703b0 | 36 | yield; |
923072b8 FG |
37 | //~^ NOTE yield occurs here |
38 | //~| NOTE value is used across a yield | |
39 | }; //~ NOTE later dropped here | |
ba9703b0 XL |
40 | require_send(send_gen); |
41 | //~^ ERROR generator cannot be sent between threads | |
923072b8 | 42 | //~| NOTE not `Send` |
ba9703b0 XL |
43 | } |
44 | ||
45 | pub fn make_gen2<T>(t: T) -> impl Generator<Return = T> { | |
923072b8 FG |
46 | //~^ NOTE appears within the type |
47 | //~| NOTE expansion of desugaring | |
48 | || { //~ NOTE used within this generator | |
ba9703b0 XL |
49 | yield; |
50 | t | |
51 | } | |
52 | } | |
923072b8 FG |
53 | fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> { //~ NOTE appears within the type |
54 | //~^ NOTE expansion of desugaring | |
ba9703b0 XL |
55 | make_gen2(Arc::new(RefCell::new(0))) |
56 | } | |
57 | ||
58 | fn test2() { | |
923072b8 | 59 | let send_gen = || { //~ NOTE used within this generator |
ba9703b0 XL |
60 | let _non_send_gen = make_non_send_generator2(); |
61 | yield; | |
62 | }; | |
63 | require_send(send_gen); | |
1b1a35ee | 64 | //~^ ERROR `RefCell<i32>` cannot be shared between threads safely |
923072b8 | 65 | //~| NOTE `RefCell<i32>` cannot be shared between threads safely |
f2b60f7d FG |
66 | //~| NOTE required for |
67 | //~| NOTE required by a bound introduced by this call | |
923072b8 | 68 | //~| NOTE captures the following types |
ba9703b0 XL |
69 | } |
70 | ||
71 | fn main() {} |