]> git.proxmox.com Git - rustc.git/blob - tests/ui/generator/conditional-drop.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / tests / 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 }