1 // run-pass 2 // ignore-wasm32-bare no libc to test ffi with 3 4 #![feature(rustc_private)] 5 6 extern crate libc; 7 8 mod rustrt { 9 extern crate libc; 10 11 #[link(name = "rust_test_helpers", kind = "static")] 12 extern "C" { rust_dbg_call( cb: extern "C" fn(libc::uintptr_t) -> libc::uintptr_t, data: libc::uintptr_t, ) -> libc::uintptr_t13 pub fn rust_dbg_call( 14 cb: extern "C" fn(libc::uintptr_t) -> libc::uintptr_t, 15 data: libc::uintptr_t, 16 ) -> libc::uintptr_t; 17 } 18 } 19 cb(data: libc::uintptr_t) -> libc::uintptr_t20extern "C" fn cb(data: libc::uintptr_t) -> libc::uintptr_t { 21 if data == 1 { data } else { fact(data - 1) * data } 22 } 23 fact(n: libc::uintptr_t) -> libc::uintptr_t24fn fact(n: libc::uintptr_t) -> libc::uintptr_t { 25 unsafe { 26 println!("n = {}", n); 27 rustrt::rust_dbg_call(cb, n) 28 } 29 } 30 main()31pub fn main() { 32 let result = fact(10); 33 println!("result = {}", result); 34 assert_eq!(result, 3628800); 35 } 36