]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/issue-68112.rs
Auto merge of #98051 - davidtwco:split-dwarf-stabilization, r=wesleywiser
[rust.git] / src / test / ui / generator / issue-68112.rs
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) {}
23 //~^ NOTE required by a bound
24 //~| NOTE required by a bound
25 //~| NOTE required by this bound
26 //~| NOTE required by this bound
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();
35         //~^ NOTE not `Send`
36         yield;
37         //~^ NOTE yield occurs here
38         //~| NOTE value is used across a yield
39     }; //~ NOTE later dropped here
40     require_send(send_gen);
41     //~^ ERROR generator cannot be sent between threads
42     //~| NOTE not `Send`
43 }
44
45 pub fn make_gen2<T>(t: T) -> impl Generator<Return = T> {
46 //~^ NOTE appears within the type
47 //~| NOTE expansion of desugaring
48     || { //~ NOTE used within this generator
49         yield;
50         t
51     }
52 }
53 fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> { //~ NOTE appears within the type
54 //~^ NOTE expansion of desugaring
55     make_gen2(Arc::new(RefCell::new(0)))
56 }
57
58 fn test2() {
59     let send_gen = || { //~ NOTE used within this generator
60         let _non_send_gen = make_non_send_generator2();
61         yield;
62     };
63     require_send(send_gen);
64     //~^ ERROR `RefCell<i32>` cannot be shared between threads safely
65     //~| NOTE `RefCell<i32>` cannot be shared between threads safely
66     //~| NOTE required for
67     //~| NOTE required by a bound introduced by this call
68     //~| NOTE captures the following types
69 }
70
71 fn main() {}