//! Ensure that a box with a custom allocator detects when the allocator itself is invalid. #![feature(allocator_api)] // This should not need the aliasing model. //@compile-flags: -Zmiri-disable-stacked-borrows use std::alloc::Layout; use std::mem::MaybeUninit; use std::ptr::NonNull; // make sure `Box` is an `Aggregate` #[allow(unused)] struct MyAlloc { my_alloc_field1: usize, my_alloc_field2: usize, } unsafe impl std::alloc::Allocator for MyAlloc { fn allocate(&self, _layout: Layout) -> Result, std::alloc::AllocError> { unimplemented!() } unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) { unimplemented!() } } #[repr(C)] struct MyBox { ptr: NonNull, alloc: MaybeUninit, } fn main() { let b = MyBox { ptr: NonNull::from(&42), alloc: MaybeUninit::uninit() }; let _b: Box = unsafe { std::mem::transmute(b) //~ERROR: uninitialized memory }; }