about summary refs log tree commit diff
path: root/src/test/ui/destructuring-assignment
diff options
context:
space:
mode:
authorFabian Zaiser <fabian.zaiser@gmail.com>2020-11-18 20:39:17 +0000
committerFabian Zaiser <fabian.zaiser@gmail.com>2020-11-18 20:42:20 +0000
commit1094f97da0bc3ce63130eac88adc997c68ce59cd (patch)
tree6bd4f57f3815559bc13360cbce0d42b9485266de /src/test/ui/destructuring-assignment
parent603ab5bd6e0ffefafa7411cd8bd23a6ca82bcff0 (diff)
downloadrust-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.rs44
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));
+}