| fn main() { |
| test_pass_struct(); |
| test_pass_struct_complex(); |
| } |
| |
| /// Test passing a basic struct as an argument. |
| fn test_pass_struct() { |
| // Exactly two fields, so that we hit the ScalarPair case. |
| #[repr(C)] |
| struct PassMe { |
| value: i32, |
| other_value: i64, |
| } |
| |
| extern "C" { |
| fn pass_struct(s: PassMe) -> i64; |
| } |
| |
| let pass_me = PassMe { value: 42, other_value: 1337 }; |
| assert_eq!(unsafe { pass_struct(pass_me) }, 42 + 1337); |
| } |
| |
| /// Test passing a more complex struct as an argument. |
| fn test_pass_struct_complex() { |
| #[repr(C)] |
| struct ComplexStruct { |
| part_1: Part1, |
| part_2: Part2, |
| part_3: u32, |
| } |
| #[repr(C)] |
| struct Part1 { |
| high: u16, |
| low: u16, |
| } |
| #[repr(C)] |
| struct Part2 { |
| bits: u32, |
| } |
| |
| extern "C" { |
| fn pass_struct_complex(s: ComplexStruct, high: u16, low: u16, bits: u32) -> i32; |
| } |
| |
| let high = 0xabcd; |
| let low = 0xef01; |
| let bits = 0xabcdef01; |
| |
| let complex = |
| ComplexStruct { part_1: Part1 { high, low }, part_2: Part2 { bits }, part_3: bits }; |
| assert_eq!(unsafe { pass_struct_complex(complex, high, low, bits) }, 0); |
| } |