Skip to content

Commit 5c2677d

Browse files
committed
Add match guard chains test, based on mir_let_chains_drop_order.rs
1 parent dcd2736 commit 5c2677d

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
//@ run-pass
2+
//@ needs-unwind
3+
//@ revisions: edition2021 edition2024
4+
//@ [edition2021] edition: 2021
5+
//@ [edition2024] edition: 2024
6+
7+
// See `mir_drop_order.rs` for more information
8+
9+
#![feature(if_let_guard)]
10+
#![allow(irrefutable_let_patterns)]
11+
12+
use std::cell::RefCell;
13+
use std::panic;
14+
15+
pub struct DropLogger<'a, T> {
16+
extra: T,
17+
id: usize,
18+
log: &'a panic::AssertUnwindSafe<RefCell<Vec<usize>>>,
19+
}
20+
21+
impl<'a, T> Drop for DropLogger<'a, T> {
22+
fn drop(&mut self) {
23+
self.log.0.borrow_mut().push(self.id);
24+
}
25+
}
26+
27+
struct InjectedFailure;
28+
29+
#[allow(unreachable_code)]
30+
fn main() {
31+
let log = panic::AssertUnwindSafe(RefCell::new(vec![]));
32+
let d = |id, extra| DropLogger { extra, id: id, log: &log };
33+
let get = || -> Vec<_> {
34+
let mut m = log.0.borrow_mut();
35+
let n = m.drain(..);
36+
n.collect()
37+
};
38+
39+
{
40+
let _x = (
41+
d(
42+
0,
43+
d(
44+
1,
45+
match () { () if let Some(_) = d(2, Some(true)).extra
46+
&& let DropLogger { .. } = d(3, None) => {
47+
None
48+
}
49+
_ => {
50+
Some(true)
51+
}
52+
}
53+
)
54+
.extra,
55+
),
56+
d(4, None),
57+
&d(5, None),
58+
d(6, None),
59+
match () {
60+
() if let DropLogger { .. } = d(7, None)
61+
&& let DropLogger { .. } = d(8, None) => {
62+
d(9, None)
63+
}
64+
_ => {
65+
// 10 is not constructed
66+
d(10, None)
67+
}
68+
},
69+
);
70+
assert_eq!(get(), vec![3, 2, 8, 7, 1]);
71+
}
72+
assert_eq!(get(), vec![0, 4, 6, 9, 5]);
73+
74+
let _ = std::panic::catch_unwind(|| {
75+
(
76+
d(
77+
11,
78+
d(
79+
12,
80+
match () {
81+
() if let Some(_) = d(13, Some(true)).extra
82+
&& let DropLogger { .. } = d(14, None) => {
83+
None
84+
}
85+
_ => {
86+
Some(true)
87+
}
88+
}
89+
)
90+
.extra,
91+
),
92+
d(15, None),
93+
&d(16, None),
94+
d(17, None),
95+
match () {
96+
() if let DropLogger { .. } = d(18, None)
97+
&& let DropLogger { .. } = d(19, None)
98+
=> {
99+
d(20, None)
100+
}
101+
_ => {
102+
// 10 is not constructed
103+
d(21, None)
104+
}
105+
},
106+
panic::panic_any(InjectedFailure),
107+
);
108+
});
109+
assert_eq!(get(), vec![14, 13, 19, 18, 20, 17, 15, 11, 16, 12]);
110+
}

0 commit comments

Comments
 (0)