//@compile-flags: -Zmiri-tree-borrows // Check that TB properly rejects alternating Reads and Writes, but tolerates // alternating only Reads to Reserved mutable references. pub fn main() { let x = &mut 0u8; let y = unsafe { &mut *(x as *mut u8) }; // Foreign Read, but this is a no-op from the point of view of y (still Reserved) let _val = *x; // Now we activate y, for this to succeed y needs to not have been Frozen // by the previous operation *y += 1; // Success // This time y gets Frozen... let _val = *x; // ... and the next Write attempt fails. //~v ERROR: /write access through .* is forbidden/ *y += 1; // Failure let _val = *x; *y += 1; // Unreachable }