]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/conditional-drop.rs
Auto merge of #98051 - davidtwco:split-dwarf-stabilization, r=wesleywiser
[rust.git] / src / test / ui / generator / conditional-drop.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
23 fn test() -> bool { true }
24 fn test2() -> bool { false }
25
26 fn main() {
27     t1();
28     t2();
29 }
30
31 fn t1() {
32     let mut a = || {
33         let b = B;
34         if test() {
35             drop(b);
36         }
37         yield;
38     };
39
40     let n = A.load(Ordering::SeqCst);
41     Pin::new(&mut a).resume(());
42     assert_eq!(A.load(Ordering::SeqCst), n + 1);
43     Pin::new(&mut a).resume(());
44     assert_eq!(A.load(Ordering::SeqCst), n + 1);
45 }
46
47 fn t2() {
48     let mut a = || {
49         let b = B;
50         if test2() {
51             drop(b);
52         }
53         yield;
54     };
55
56     let n = A.load(Ordering::SeqCst);
57     Pin::new(&mut a).resume(());
58     assert_eq!(A.load(Ordering::SeqCst), n);
59     Pin::new(&mut a).resume(());
60     assert_eq!(A.load(Ordering::SeqCst), n + 1);
61 }