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_t20 extern "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_t24 fn 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()31 pub fn main() {
32     let result = fact(10);
33     println!("result = {}", result);
34     assert_eq!(result, 3628800);
35 }
36