diff options
| author | Fabian Zaiser <fabian.zaiser@gmail.com> | 2020-11-18 20:39:17 +0000 |
|---|---|---|
| committer | Fabian Zaiser <fabian.zaiser@gmail.com> | 2020-11-18 20:42:20 +0000 |
| commit | 1094f97da0bc3ce63130eac88adc997c68ce59cd (patch) | |
| tree | 6bd4f57f3815559bc13360cbce0d42b9485266de /src/test/ui/destructuring-assignment | |
| parent | 603ab5bd6e0ffefafa7411cd8bd23a6ca82bcff0 (diff) | |
| download | rust-1094f97da0bc3ce63130eac88adc997c68ce59cd.tar.gz rust-1094f97da0bc3ce63130eac88adc997c68ce59cd.zip | |
Test drop order for (destructuring) assignments
Diffstat (limited to 'src/test/ui/destructuring-assignment')
| -rw-r--r-- | src/test/ui/destructuring-assignment/drop-order.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/test/ui/destructuring-assignment/drop-order.rs b/src/test/ui/destructuring-assignment/drop-order.rs new file mode 100644 index 00000000000..d06b31c7f27 --- /dev/null +++ b/src/test/ui/destructuring-assignment/drop-order.rs @@ -0,0 +1,44 @@ +// run-pass + +//! Test that let bindings and destructuring assignments have consistent drop orders + +#![feature(destructuring_assignment)] +#![allow(unused_variables, unused_assignments)] + +use std::cell::RefCell; + +thread_local! { + static DROP_ORDER: RefCell<Vec<usize>> = RefCell::new(Vec::new()); +} + +struct DropRecorder(usize); +impl Drop for DropRecorder { + fn drop(&mut self) { + DROP_ORDER.with(|d| d.borrow_mut().push(self.0)); + } +} + +fn main() { + let expected_drop_order = vec![1, 4, 5, 3, 2]; + // Check the drop order for let bindings: + { + let _ = DropRecorder(1); + let _val = DropRecorder(2); + let (x, _) = (DropRecorder(3), DropRecorder(4)); + drop(DropRecorder(5)); + } + DROP_ORDER.with(|d| { + assert_eq!(&*d.borrow(), &expected_drop_order); + d.borrow_mut().clear(); + }); + // Check that the drop order for destructuring assignment is the same: + { + let _val; + let x; + _ = DropRecorder(1); + _val = DropRecorder(2); + (x, _) = (DropRecorder(3), DropRecorder(4)); + drop(DropRecorder(5)); + } + DROP_ORDER.with(|d| assert_eq!(&*d.borrow(), &expected_drop_order)); +} |
