//@compile-flags: -Zmiri-tree-borrows // Check that in the case of locations outside the range of a pointer, // protectors trigger if and only if the location has already been accessed fn main() { unsafe { let data = &mut [0u8, 1, 2, 3]; let raw = data.as_mut_ptr(); stuff(&mut *raw, raw); } } unsafe fn stuff(x: &mut u8, y: *mut u8) { let xraw = x as *mut u8; // No issue here: location 1 is not accessed *y.add(1) = 42; // Still no issue: location 2 is not invalidated let _val = *xraw.add(2); // However protector triggers if location is both accessed and invalidated let _val = *xraw.add(3); *y.add(3) = 42; //~ ERROR: /write access through .* is forbidden/ }