| // should find the bug even without, but gets masked by optimizations | |
| //@compile-flags: -Zmiri-disable-stacked-borrows -Cdebug-assertions=no | |
| //@normalize-stderr-test: "but found [0-9]+" -> "but found $$ALIGN" | |
| #[repr(align(256))] | |
| #[derive(Debug)] | |
| struct MuchAlign; | |
| fn main() { | |
| // Try many times as this might work by chance. | |
| for _ in 0..20 { | |
| let buf = [0u32; 256]; | |
| // `buf` is sufficiently aligned for `layout.align` on a `dyn Debug`, but not | |
| // for the actual alignment required by `MuchAlign`. | |
| // We craft a wide reference `&dyn Debug` with the vtable for `MuchAlign`. That should be UB, | |
| // as the reference is not aligned to its dynamic alignment requirements. | |
| let mut ptr = &MuchAlign as &dyn std::fmt::Debug; | |
| // Overwrite the data part of `ptr` so it points to `buf`. | |
| unsafe { | |
| (&mut ptr as *mut _ as *mut *const u8).write(&buf as *const _ as *const u8); | |
| } | |
| // Re-borrow that. This should be UB. | |
| let _ptr = &*ptr; //~ERROR: required 256 byte alignment | |
| } | |
| } |