| // We disable the GC for this test because it would change what is printed. |
| //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 |
| |
| #[path = "../../utils/mod.rs"] |
| #[macro_use] |
| mod utils; |
| |
| // Check the formatting of the trees. |
| fn main() { |
| unsafe { |
| alignment_check(); |
| structure_check(); |
| } |
| } |
| |
| // Alignment check: we split the array at indexes with different amounts of |
| // decimal digits to verify proper padding. |
| unsafe fn alignment_check() { |
| let data: &mut [u8] = &mut [0; 1024]; |
| name!(data.as_ptr()=>2, "data"); |
| name!(data.as_ptr()=>2, "data"); |
| let alloc_id = alloc_id!(data.as_ptr()); |
| let x = &mut data[1]; |
| name!(x as *mut _, "data[1]"); |
| *x = 1; |
| let x = &mut data[10]; |
| name!(x as *mut _, "data[10]"); |
| *x = 1; |
| let x = &mut data[100]; |
| name!(x as *mut _, "data[100]"); |
| *x = 1; |
| let _val = data[100]; // So that the above is Frz |
| let x = &mut data[1000]; |
| name!(x as *mut _, "data[1000]"); |
| *x = 1; |
| print_state!(alloc_id); |
| } |
| |
| // Tree structure check: somewhat complex organization of reborrows. |
| unsafe fn structure_check() { |
| let x = &0u8; |
| name!(x); |
| let xa = &*x; |
| name!(xa); |
| let xb = &*x; |
| name!(xb); |
| let xc = &*x; |
| name!(xc); |
| let xaa = &*xa; |
| name!(xaa); |
| let xab = &*xa; |
| name!(xab); |
| let xba = &*xb; |
| name!(xba); |
| let xbaa = &*xba; |
| name!(xbaa); |
| let xbaaa = &*xbaa; |
| name!(xbaaa); |
| let xbaaaa = &*xbaaa; |
| name!(xbaaaa); |
| let xca = &*xc; |
| name!(xca); |
| let xcb = &*xc; |
| name!(xcb); |
| let xcaa = &*xca; |
| name!(xcaa); |
| let xcab = &*xca; |
| name!(xcab); |
| let xcba = &*xcb; |
| name!(xcba); |
| let xcbb = &*xcb; |
| name!(xcbb); |
| let alloc_id = alloc_id!(x); |
| print_state!(alloc_id); |
| } |