| //@ run-pass |
| #![allow(improper_ctypes)] |
| |
| // Test a foreign function that accepts and returns a struct by value. |
| |
| // FiveU16s in particular is interesting because it is larger than a single 64 bit or 32 bit |
| // register, which are used as cast destinations on some targets, but does not evenly divide those |
| // sizes, causing there to be padding in the last element. |
| |
| #[derive(Copy, Clone, PartialEq, Debug)] |
| pub struct FiveU16s { |
| one: u16, |
| two: u16, |
| three: u16, |
| four: u16, |
| five: u16, |
| } |
| |
| #[link(name = "rust_test_helpers", kind = "static")] |
| extern "C" { |
| pub fn rust_dbg_extern_identity_FiveU16s(v: FiveU16s) -> FiveU16s; |
| } |
| |
| pub fn main() { |
| unsafe { |
| let x = FiveU16s { one: 22, two: 23, three: 24, four: 25, five: 26 }; |
| let y = rust_dbg_extern_identity_FiveU16s(x); |
| assert_eq!(x, y); |
| } |
| } |