]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/drop-env.rs
Auto merge of #98051 - davidtwco:split-dwarf-stabilization, r=wesleywiser
[rust.git] / src / test / ui / generator / drop-env.rs
1 // run-pass
2
3 // revisions: default nomiropt
4 //[nomiropt]compile-flags: -Z mir-opt-level=0
5
6 #![feature(generators, generator_trait)]
7
8 use std::ops::Generator;
9 use std::pin::Pin;
10 use std::sync::atomic::{AtomicUsize, Ordering};
11
12 static A: AtomicUsize = AtomicUsize::new(0);
13
14 struct B;
15
16 impl Drop for B {
17     fn drop(&mut self) {
18         A.fetch_add(1, Ordering::SeqCst);
19     }
20 }
21
22 fn main() {
23     t1();
24     t2();
25     t3();
26 }
27
28 fn t1() {
29     let b = B;
30     let mut foo = || {
31         yield;
32         drop(b);
33     };
34
35     let n = A.load(Ordering::SeqCst);
36     drop(Pin::new(&mut foo).resume(()));
37     assert_eq!(A.load(Ordering::SeqCst), n);
38     drop(foo);
39     assert_eq!(A.load(Ordering::SeqCst), n + 1);
40 }
41
42 fn t2() {
43     let b = B;
44     let mut foo = || {
45         yield b;
46     };
47
48     let n = A.load(Ordering::SeqCst);
49     drop(Pin::new(&mut foo).resume(()));
50     assert_eq!(A.load(Ordering::SeqCst), n + 1);
51     drop(foo);
52     assert_eq!(A.load(Ordering::SeqCst), n + 1);
53 }
54
55 fn t3() {
56     let b = B;
57     let foo = || {
58         yield;
59         drop(b);
60     };
61
62     let n = A.load(Ordering::SeqCst);
63     assert_eq!(A.load(Ordering::SeqCst), n);
64     drop(foo);
65     assert_eq!(A.load(Ordering::SeqCst), n + 1);
66 }