| //@ run-pass | 
 |  | 
 | #![allow(dead_code)] | 
 | #![allow(unused_variables)] | 
 | // FIXME(static_mut_refs): this could use an atomic | 
 | #![allow(static_mut_refs)] | 
 |  | 
 | // Drop works for union itself. | 
 |  | 
 | #[derive(Copy, Clone)] | 
 | struct S; | 
 |  | 
 | union U { | 
 |     a: u8 | 
 | } | 
 |  | 
 | union W { | 
 |     a: S, | 
 | } | 
 |  | 
 | union Y { | 
 |     a: S, | 
 | } | 
 |  | 
 | impl Drop for U { | 
 |     fn drop(&mut self) { | 
 |         unsafe { CHECK += 1; } | 
 |     } | 
 | } | 
 |  | 
 | impl Drop for W { | 
 |     fn drop(&mut self) { | 
 |         unsafe { CHECK += 1; } | 
 |     } | 
 | } | 
 |  | 
 | static mut CHECK: u8 = 0; | 
 |  | 
 | fn main() { | 
 |     unsafe { | 
 |         assert_eq!(CHECK, 0); | 
 |         { | 
 |             let u = U { a: 1 }; | 
 |         } | 
 |         assert_eq!(CHECK, 1); // 1, dtor of U is called | 
 |         { | 
 |             let w = W { a: S }; | 
 |         } | 
 |         assert_eq!(CHECK, 2); // 2, dtor of W is called | 
 |         { | 
 |             let y = Y { a: S }; | 
 |         } | 
 |         assert_eq!(CHECK, 2); // 2, Y has no dtor | 
 |         { | 
 |             let u2 = U { a: 1 }; | 
 |             std::mem::forget(u2); | 
 |         } | 
 |         assert_eq!(CHECK, 2); // 2, dtor of U *not* called for u2 | 
 |     } | 
 | } |