]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/print/generator-print-verbose-1.rs
Add tests for updated closure/generator printing
[rust.git] / src / test / ui / generator / print / generator-print-verbose-1.rs
1 // compile-flags: -Zverbose
2
3 // Same as: src/test/ui/generator/issue-68112.stderr
4
5 #![feature(generators, generator_trait)]
6
7 use std::{
8     cell::RefCell,
9     sync::Arc,
10     pin::Pin,
11     ops::{Generator, GeneratorState},
12 };
13
14 pub struct Ready<T>(Option<T>);
15 impl<T> Generator<()> for Ready<T> {
16     type Return = T;
17     type Yield = ();
18     fn resume(mut self: Pin<&mut Self>, _args: ()) -> GeneratorState<(), T> {
19         GeneratorState::Complete(self.0.take().unwrap())
20     }
21 }
22 pub fn make_gen1<T>(t: T) -> Ready<T> {
23     Ready(Some(t))
24 }
25
26 fn require_send(_: impl Send) {}
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         yield;
36     };
37     require_send(send_gen);
38     //~^ ERROR generator cannot be sent between threads
39 }
40
41 pub fn make_gen2<T>(t: T) -> impl Generator<Return = T> {
42     || {
43         yield;
44         t
45     }
46 }
47 fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> {
48     make_gen2(Arc::new(RefCell::new(0)))
49 }
50
51 fn test2() {
52     let send_gen = || {
53         let _non_send_gen = make_non_send_generator2();
54         yield;
55     };
56     require_send(send_gen);
57     //~^ ERROR `RefCell<i32>` cannot be shared between threads safely
58 }
59
60 fn main() {}