31 lines
840 B
Rust
31 lines
840 B
Rust
|
//@ 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);
|
||
|
}
|
||
|
}
|