use std::mem::ManuallyDrop; #[derive(Clone, Copy)] struct Copy; struct NonCopy; union Unn { n1: ManuallyDrop, n2: ManuallyDrop, } union Ucc { c1: Copy, c2: Copy, } union Ucn { c: Copy, n: ManuallyDrop, } fn main() { unsafe { // 2 NonCopy { let mut u = Unn { n1: ManuallyDrop::new(NonCopy) }; let a = u.n1; let a = u.n1; //~ ERROR use of moved value: `u` } { let mut u = Unn { n1: ManuallyDrop::new(NonCopy) }; let a = u.n1; let a = u; //~ ERROR use of moved value: `u` } { let mut u = Unn { n1: ManuallyDrop::new(NonCopy) }; let a = u.n1; let a = u.n2; //~ ERROR use of moved value: `u` } // 2 Copy { let mut u = Ucc { c1: Copy }; let a = u.c1; let a = u.c1; // OK } { let mut u = Ucc { c1: Copy }; let a = u.c1; let a = u; // OK } { let mut u = Ucc { c1: Copy }; let a = u.c1; let a = u.c2; // OK } // 1 Copy, 1 NonCopy { let mut u = Ucn { c: Copy }; let a = u.c; let a = u.c; // OK } { let mut u = Ucn { c: Copy }; let a = u.n; let a = u.n; //~ ERROR use of moved value: `u` } { let mut u = Ucn { c: Copy }; let a = u.n; let a = u.c; //~ ERROR use of moved value: `u` } { let mut u = Ucn { c: Copy }; let a = u.c; let a = u.n; // OK } { let mut u = Ucn { c: Copy }; let a = u.c; let a = u; // OK } { let mut u = Ucn { c: Copy }; let a = u.n; let a = u; //~ ERROR use of moved value: `u` } } }