Skip to content

Commit 0db1276

Browse files
diannetraviscross
andcommitted
add drop order test for destructuring assignments
Co-authored-by: Travis Cross <[email protected]>
1 parent 0e6aa45 commit 0db1276

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Test drop order for destructuring assignments against
2+
// other expressions they should be consistent with.
3+
//
4+
// See:
5+
//
6+
// - https://github.com/rust-lang/rust/pull/145838
7+
//
8+
// Original author: TC
9+
// Date: 2025-08-30
10+
//@ edition: 2024
11+
//@ run-pass
12+
13+
#![allow(unused_must_use)]
14+
15+
fn main() {
16+
assert_drop_order(1..=3, |e| {
17+
&({ &raw const *&e.log(1) }, drop(e.log(2)));
18+
drop(e.log(3));
19+
});
20+
assert_drop_order(1..=3, |e| {
21+
{ let _x; _x = &({ &raw const *&e.log(1) }, drop(e.log(2))); }
22+
drop(e.log(3));
23+
});
24+
assert_drop_order(1..=3, |e| {
25+
_ = &({ &raw const *&e.log(2) }, drop(e.log(1)));
26+
drop(e.log(3));
27+
});
28+
assert_drop_order(1..=3, |e| {
29+
{ let _ = &({ &raw const *&e.log(2) }, drop(e.log(1))); }
30+
drop(e.log(3));
31+
});
32+
assert_drop_order(1..=3, |e| {
33+
let _x; let _y;
34+
(_x, _y) = ({ &raw const *&e.log(2) }, drop(e.log(1)));
35+
drop(e.log(3));
36+
});
37+
}
38+
39+
// # Test scaffolding...
40+
41+
use core::cell::RefCell;
42+
43+
struct DropOrder(RefCell<Vec<u64>>);
44+
struct LogDrop<'o>(&'o DropOrder, u64);
45+
46+
impl DropOrder {
47+
fn log(&self, n: u64) -> LogDrop<'_> {
48+
LogDrop(self, n)
49+
}
50+
}
51+
52+
impl<'o> Drop for LogDrop<'o> {
53+
fn drop(&mut self) {
54+
self.0 .0.borrow_mut().push(self.1);
55+
}
56+
}
57+
58+
#[track_caller]
59+
fn assert_drop_order(
60+
ex: impl IntoIterator<Item = u64>,
61+
f: impl Fn(&DropOrder),
62+
) {
63+
let order = DropOrder(RefCell::new(Vec::new()));
64+
f(&order);
65+
let order = order.0.into_inner();
66+
let expected: Vec<u64> = ex.into_iter().collect();
67+
assert_eq!(order, expected);
68+
}

0 commit comments

Comments
 (0)