//@ known-bug: #114484 use std::marker::PhantomData; trait MyTrait { fn virtualize(&self) -> &dyn MyTrait; } struct VirtualWrapper(T); impl VirtualWrapper { pub fn wrap(value: &T) -> &Self { unsafe { &*(value as *const T as *const Self) } } } impl MyTrait for VirtualWrapper { fn virtualize(&self) -> &dyn MyTrait { unsafe { virtualize_my_trait(L, self) } // unsafe { virtualize_my_trait(L, &self.0) } // <-- this code fixes the problem } } const unsafe fn virtualize_my_trait(level: u8, obj: &T) -> &dyn MyTrait where T: MyTrait + 'static, { const fn gen_vtable_ptr() -> *const () where T: MyTrait + 'static, { let [_, vtable] = unsafe { std::mem::transmute::<*const dyn MyTrait, [*const (); 2]>(std::ptr::null::< VirtualWrapper, >()) }; vtable } struct Vtable(PhantomData); impl Vtable where T: MyTrait + 'static, { const LEVELS: [*const (); 2] = [gen_vtable_ptr::(), gen_vtable_ptr::()]; } let vtable = Vtable::::LEVELS[(level != 0) as usize]; let data = obj as *const T as *const (); let ptr: *const dyn MyTrait = std::mem::transmute([data, vtable]); &*ptr } struct SomeData([u8; N]); impl MyTrait for SomeData { fn virtualize(&self) -> &dyn MyTrait { VirtualWrapper::::wrap(self) } } fn main() { let test = SomeData([0; 256]); test.virtualize(); }