#![crate_type = "cdylib"] | |
#![crate_name = "foo"] | |
extern "C" fn ret32() -> i32 { | |
32 | |
} | |
#[no_mangle] | |
pub extern "C" fn foo(ptr: extern "C" fn(extern "C" fn() -> i32)) { | |
assert_eq!((ptr as usize) >> 56, 0x1f); | |
// Store an arbitrary tag in the tag bits, and convert back to the correct pointer type. | |
let p = ((ret32 as usize) | (0x2f << 56)) as *const (); | |
let p: extern "C" fn() -> i32 = unsafe { std::mem::transmute(p) }; | |
unsafe { ptr(p) } | |
} |