summaryrefslogtreecommitdiffstats
path: root/src/test/ui/abi/numbers-arithmetic/i128-ffi.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/abi/numbers-arithmetic/i128-ffi.rs')
-rw-r--r--src/test/ui/abi/numbers-arithmetic/i128-ffi.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/test/ui/abi/numbers-arithmetic/i128-ffi.rs b/src/test/ui/abi/numbers-arithmetic/i128-ffi.rs
new file mode 100644
index 000000000..19edf9779
--- /dev/null
+++ b/src/test/ui/abi/numbers-arithmetic/i128-ffi.rs
@@ -0,0 +1,31 @@
+// run-pass
+#![allow(improper_ctypes)]
+
+// MSVC doesn't support 128 bit integers, and other Windows
+// C compilers have very inconsistent views on how the ABI
+// should look like.
+
+// ignore-windows
+// ignore-32bit
+
+#[link(name = "rust_test_helpers", kind = "static")]
+extern "C" {
+ fn identity(f: u128) -> u128;
+ fn square(f: i128) -> i128;
+ fn sub(f: i128, f: i128) -> i128;
+}
+
+fn main() {
+ unsafe {
+ let a = 0x734C_C2F2_A521;
+ let b = 0x33EE_0E2A_54E2_59DA_A0E7_8E41;
+ let b_out = identity(b);
+ assert_eq!(b, b_out);
+ let a_square = square(a);
+ assert_eq!(b, a_square as u128);
+ let k = 0x1234_5678_9ABC_DEFF_EDCB_A987_6543_210;
+ let k_d = 0x2468_ACF1_3579_BDFF_DB97_530E_CA86_420;
+ let k_out = sub(k_d, k);
+ assert_eq!(k, k_out);
+ }
+}