summaryrefslogtreecommitdiffstats
path: root/src/test/ui/abi/foreign/foreign-call-no-runtime.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/abi/foreign/foreign-call-no-runtime.rs')
-rw-r--r--src/test/ui/abi/foreign/foreign-call-no-runtime.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/test/ui/abi/foreign/foreign-call-no-runtime.rs b/src/test/ui/abi/foreign/foreign-call-no-runtime.rs
new file mode 100644
index 000000000..d5b90a359
--- /dev/null
+++ b/src/test/ui/abi/foreign/foreign-call-no-runtime.rs
@@ -0,0 +1,60 @@
+// run-pass
+// ignore-emscripten no threads support
+
+#![feature(rustc_private)]
+
+extern crate libc;
+
+use std::mem;
+use std::thread;
+
+#[link(name = "rust_test_helpers", kind = "static")]
+extern "C" {
+ fn rust_dbg_call(cb: extern "C" fn(libc::uintptr_t), data: libc::uintptr_t) -> libc::uintptr_t;
+}
+
+pub fn main() {
+ unsafe {
+ thread::spawn(move || {
+ let i: isize = 100;
+ rust_dbg_call(callback_isize, mem::transmute(&i));
+ })
+ .join()
+ .unwrap();
+
+ thread::spawn(move || {
+ let i: i32 = 100;
+ rust_dbg_call(callback_i32, mem::transmute(&i));
+ })
+ .join()
+ .unwrap();
+
+ thread::spawn(move || {
+ let i: i64 = 100;
+ rust_dbg_call(callback_i64, mem::transmute(&i));
+ })
+ .join()
+ .unwrap();
+ }
+}
+
+extern "C" fn callback_isize(data: libc::uintptr_t) {
+ unsafe {
+ let data: *const isize = mem::transmute(data);
+ assert_eq!(*data, 100);
+ }
+}
+
+extern "C" fn callback_i64(data: libc::uintptr_t) {
+ unsafe {
+ let data: *const i64 = mem::transmute(data);
+ assert_eq!(*data, 100);
+ }
+}
+
+extern "C" fn callback_i32(data: libc::uintptr_t) {
+ unsafe {
+ let data: *const i32 = mem::transmute(data);
+ assert_eq!(*data, 100);
+ }
+}