| //@ 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<T: Foo>() -> &'static Vtable { | |
| &Vtable { | |
| module: T::Mod::THIS_MODULE_PTR, | |
| foo_fn: |ptr| unsafe { &mut *ptr.cast::<T>() }.foo(), | |
| } | |
| } | |
| fn main() {} |