summaryrefslogtreecommitdiffstats
path: root/tests/ui/union/union-drop-assign.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/union/union-drop-assign.rs')
-rw-r--r--tests/ui/union/union-drop-assign.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/ui/union/union-drop-assign.rs b/tests/ui/union/union-drop-assign.rs
new file mode 100644
index 000000000..215666bdd
--- /dev/null
+++ b/tests/ui/union/union-drop-assign.rs
@@ -0,0 +1,37 @@
+// run-pass
+#![allow(unused_assignments)]
+
+// Drop works for union itself.
+
+use std::mem::ManuallyDrop;
+
+struct S;
+
+union U {
+ a: ManuallyDrop<S>
+}
+
+impl Drop for S {
+ fn drop(&mut self) {
+ unsafe { CHECK += 10; }
+ }
+}
+
+impl Drop for U {
+ fn drop(&mut self) {
+ unsafe { CHECK += 1; }
+ }
+}
+
+static mut CHECK: u8 = 0;
+
+fn main() {
+ unsafe {
+ let mut u = U { a: ManuallyDrop::new(S) };
+ assert_eq!(CHECK, 0);
+ u = U { a: ManuallyDrop::new(S) };
+ assert_eq!(CHECK, 1); // union itself is assigned, union is dropped, field is not dropped
+ *u.a = S;
+ assert_eq!(CHECK, 11); // union field is assigned, field is dropped
+ }
+}