#![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) } }