]> git.proxmox.com Git - rustc.git/blob - tests/ui/generator/panic-drops.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / tests / ui / generator / panic-drops.rs
1 // run-pass
2 // needs-unwind
3
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 }