2022-09-23 12:03:13 +00:00
|
|
|
#![feature(inline_const, const_type_id)]
|
|
|
|
|
|
|
|
use std::alloc::Layout;
|
|
|
|
use std::any::TypeId;
|
|
|
|
use std::mem::transmute;
|
|
|
|
use std::ptr::drop_in_place;
|
|
|
|
|
|
|
|
pub struct VTable {
|
|
|
|
layout: Layout,
|
|
|
|
type_id: TypeId,
|
|
|
|
drop_in_place: unsafe fn(*mut ()),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl VTable {
|
|
|
|
pub fn new<T>() -> &'static Self {
|
|
|
|
const {
|
|
|
|
&VTable {
|
|
|
|
layout: Layout::new::<T>(),
|
|
|
|
type_id: TypeId::of::<T>(),
|
2022-10-03 10:45:02 +00:00
|
|
|
//~^ ERROR the parameter type `T` may not live long enough
|
|
|
|
//~| ERROR the parameter type `T` may not live long enough
|
2022-09-23 12:03:13 +00:00
|
|
|
drop_in_place: unsafe {
|
|
|
|
transmute::<unsafe fn(*mut T), unsafe fn(*mut ())>(drop_in_place::<T>)
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|