]> git.proxmox.com Git - rustc.git/blob - src/test/run-pass/generator/panic-drops.rs
New upstream version 1.33.0+dfsg1
[rustc.git] / src / test / run-pass / 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::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
10
11 static A: AtomicUsize = ATOMIC_USIZE_INIT;
12
13 struct B;
14
15 impl Drop for B {
16 fn drop(&mut self) {
17 A.fetch_add(1, Ordering::SeqCst);
18 }
19 }
20
21 fn bool_true() -> bool {
22 true
23 }
24
25 fn main() {
26 let b = B;
27 let mut foo = || {
28 if bool_true() {
29 panic!();
30 }
31 drop(b);
32 yield;
33 };
34
35 assert_eq!(A.load(Ordering::SeqCst), 0);
36 let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
37 unsafe { foo.resume() }
38 }));
39 assert!(res.is_err());
40 assert_eq!(A.load(Ordering::SeqCst), 1);
41
42 let mut foo = || {
43 if bool_true() {
44 panic!();
45 }
46 drop(B);
47 yield;
48 };
49
50 assert_eq!(A.load(Ordering::SeqCst), 1);
51 let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
52 unsafe { foo.resume() }
53 }));
54 assert!(res.is_err());
55 assert_eq!(A.load(Ordering::SeqCst), 1);
56 }