]> git.lizzy.rs Git - rust.git/blob - src/test/ui/abi/foreign/foreign-call-no-runtime.rs
Rollup merge of #95353 - jyn514:invalid-filter-hard-error, r=Mark-Simulacrum
[rust.git] / src / test / ui / abi / foreign / foreign-call-no-runtime.rs
1 // run-pass
2 // ignore-emscripten no threads support
3
4 #![feature(rustc_private)]
5
6 extern crate libc;
7
8 use std::mem;
9 use std::thread;
10
11 #[link(name = "rust_test_helpers", kind = "static")]
12 extern "C" {
13     fn rust_dbg_call(cb: extern "C" fn(libc::uintptr_t), data: libc::uintptr_t) -> libc::uintptr_t;
14 }
15
16 pub fn main() {
17     unsafe {
18         thread::spawn(move || {
19             let i: isize = 100;
20             rust_dbg_call(callback_isize, mem::transmute(&i));
21         })
22         .join()
23         .unwrap();
24
25         thread::spawn(move || {
26             let i: i32 = 100;
27             rust_dbg_call(callback_i32, mem::transmute(&i));
28         })
29         .join()
30         .unwrap();
31
32         thread::spawn(move || {
33             let i: i64 = 100;
34             rust_dbg_call(callback_i64, mem::transmute(&i));
35         })
36         .join()
37         .unwrap();
38     }
39 }
40
41 extern "C" fn callback_isize(data: libc::uintptr_t) {
42     unsafe {
43         let data: *const isize = mem::transmute(data);
44         assert_eq!(*data, 100);
45     }
46 }
47
48 extern "C" fn callback_i64(data: libc::uintptr_t) {
49     unsafe {
50         let data: *const i64 = mem::transmute(data);
51         assert_eq!(*data, 100);
52     }
53 }
54
55 extern "C" fn callback_i32(data: libc::uintptr_t) {
56     unsafe {
57         let data: *const i32 = mem::transmute(data);
58         assert_eq!(*data, 100);
59     }
60 }