]> git.lizzy.rs Git - rust.git/blob - src/test/ui/mir/mir_let_chains_drop_order.rs
Auto merge of #93718 - thomcc:used-macho, r=pnkfelix
[rust.git] / src / test / ui / mir / mir_let_chains_drop_order.rs
1 // run-pass
2 // needs-unwind
3 // ignore-wasm32-bare compiled with panic=abort by default
4
5 // See `mir_drop_order.rs` for more information
6
7 #![allow(irrefutable_let_patterns)]
8
9 use std::cell::RefCell;
10 use std::panic;
11
12 pub struct DropLogger<'a, T> {
13     extra: T,
14     id: usize,
15     log: &'a panic::AssertUnwindSafe<RefCell<Vec<usize>>>
16 }
17
18 impl<'a, T> Drop for DropLogger<'a, T> {
19     fn drop(&mut self) {
20         self.log.0.borrow_mut().push(self.id);
21     }
22 }
23
24 struct InjectedFailure;
25
26 #[allow(unreachable_code)]
27 fn main() {
28     let log = panic::AssertUnwindSafe(RefCell::new(vec![]));
29     let d = |id, extra| DropLogger { extra, id: id, log: &log };
30     let get = || -> Vec<_> {
31         let mut m = log.0.borrow_mut();
32         let n = m.drain(..);
33         n.collect()
34     };
35
36     {
37         let _x = (
38             d(
39                 0,
40                 d(
41                     1,
42                     if let Some(_) = d(2, Some(true)).extra && let DropLogger { .. } = d(3, None) {
43                         None
44                     } else {
45                         Some(true)
46                     }
47                 ).extra
48             ),
49             d(4, None),
50             &d(5, None),
51             d(6, None),
52             if let DropLogger { .. } = d(7, None) && let DropLogger { .. } = d(8, None) {
53                 d(9, None)
54             }
55             else {
56                 // 10 is not constructed
57                 d(10, None)
58             }
59         );
60         assert_eq!(get(), vec![3, 8, 7, 1, 2]);
61     }
62     assert_eq!(get(), vec![0, 4, 6, 9, 5]);
63
64     let _ = std::panic::catch_unwind(|| {
65         (
66             d(
67                 11,
68                 d(
69                     12,
70                     if let Some(_) = d(13, Some(true)).extra
71                         && let DropLogger { .. } = d(14, None)
72                     {
73                         None
74                     } else {
75                         Some(true)
76                     }
77                 ).extra
78             ),
79             d(15, None),
80             &d(16, None),
81             d(17, None),
82             if let DropLogger { .. } = d(18, None) && let DropLogger { .. } = d(19, None) {
83                 d(20, None)
84             }
85             else {
86                 // 10 is not constructed
87                 d(21, None)
88             },
89             panic::panic_any(InjectedFailure)
90         );
91     });
92     assert_eq!(get(), vec![14, 19, 20, 17, 15, 11, 18, 16, 12, 13]);
93 }