]> git.proxmox.com Git - rustc.git/blame - src/test/ui/generator/issue-68112.rs
New upstream version 1.65.0+dfsg1
[rustc.git] / src / test / ui / generator / issue-68112.rs
CommitLineData
ba9703b0
XL
1#![feature(generators, generator_trait)]
2
3use std::{
4 cell::RefCell,
5 sync::Arc,
6 pin::Pin,
7 ops::{Generator, GeneratorState},
8};
9
10pub struct Ready<T>(Option<T>);
11impl<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}
18pub fn make_gen1<T>(t: T) -> Ready<T> {
19 Ready(Some(t))
20}
21
22fn 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
28fn make_non_send_generator() -> impl Generator<Return = Arc<RefCell<i32>>> {
29 make_gen1(Arc::new(RefCell::new(0)))
30}
31
32fn 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
45pub 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
53fn 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
58fn 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
71fn main() {}