#![allow(unused)] // This tests the error messages for borrows of union fields when the unions are embedded in other // structs or unions. #[derive(Clone, Copy, Default)] struct Leaf { l1_u8: u8, l2_u8: u8, } #[derive(Clone, Copy)] union First { f1_leaf: Leaf, f2_leaf: Leaf, f3_union: Second, } #[derive(Clone, Copy)] union Second { s1_leaf: Leaf, s2_leaf: Leaf, } struct Root { r1_u8: u8, r2_union: First, } // Borrow a different field of the nested union. fn nested_union() { unsafe { let mut r = Root { r1_u8: 3, r2_union: First { f3_union: Second { s2_leaf: Leaf { l1_u8: 8, l2_u8: 4 } } } }; let mref = &mut r.r2_union.f3_union.s1_leaf.l1_u8; // ^^^^^^^ *mref = 22; let nref = &r.r2_union.f3_union.s2_leaf.l1_u8; // ^^^^^^^ //~^^ ERROR cannot borrow `r.r2_union.f3_union` (via `r.r2_union.f3_union.s2_leaf.l1_u8`) as immutable because it is also borrowed as mutable (via `r.r2_union.f3_union.s1_leaf.l1_u8`) [E0502] println!("{} {}", mref, nref) } } // Borrow a different field of the first union. fn first_union() { unsafe { let mut r = Root { r1_u8: 3, r2_union: First { f3_union: Second { s2_leaf: Leaf { l1_u8: 8, l2_u8: 4 } } } }; let mref = &mut r.r2_union.f2_leaf.l1_u8; // ^^^^^^^ *mref = 22; let nref = &r.r2_union.f1_leaf.l1_u8; // ^^^^^^^ //~^^ ERROR cannot borrow `r.r2_union` (via `r.r2_union.f1_leaf.l1_u8`) as immutable because it is also borrowed as mutable (via `r.r2_union.f2_leaf.l1_u8`) [E0502] println!("{} {}", mref, nref) } } fn main() {}