//@ check-pass //! This is the reduced version of the "Linux kernel vtable" use-case. use std::ptr::addr_of_mut; #[repr(C)] struct ThisModule(i32); trait Module { const THIS_MODULE_PTR: *mut ThisModule; } struct MyModule; // Generated by a macro. extern "C" { static mut THIS_MODULE: ThisModule; } // Generated by a macro. impl Module for MyModule { const THIS_MODULE_PTR: *mut ThisModule = unsafe { addr_of_mut!(THIS_MODULE) }; } struct Vtable { module: *mut ThisModule, foo_fn: fn(*mut ()) -> i32, } trait Foo { type Mod: Module; fn foo(&mut self) -> i32; } fn generate_vtable() -> &'static Vtable { &Vtable { module: T::Mod::THIS_MODULE_PTR, foo_fn: |ptr| unsafe { &mut *ptr.cast::() }.foo(), } } fn main() {}