]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/panic-drops.rs
Auto merge of #65140 - petrochenkov:disapp, r=nikomatsakis
[rust.git] / src / test / ui / generator / panic-drops.rs
1 // run-pass
2
3 // ignore-wasm32-bare compiled as panic=abort by default
4
5 #![feature(generators, generator_trait)]
6
7 use std::ops::Generator;
8 use std::panic;
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 bool_true() -> bool {
23     true
24 }
25
26 fn main() {
27     let b = B;
28     let mut foo = || {
29         if bool_true() {
30             panic!();
31         }
32         drop(b);
33         yield;
34     };
35
36     assert_eq!(A.load(Ordering::SeqCst), 0);
37     let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
38         Pin::new(&mut foo).resume()
39     }));
40     assert!(res.is_err());
41     assert_eq!(A.load(Ordering::SeqCst), 1);
42
43     let mut foo = || {
44         if bool_true() {
45             panic!();
46         }
47         drop(B);
48         yield;
49     };
50
51     assert_eq!(A.load(Ordering::SeqCst), 1);
52     let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
53         Pin::new(&mut foo).resume()
54     }));
55     assert!(res.is_err());
56     assert_eq!(A.load(Ordering::SeqCst), 1);
57 }