rust/tests/ui/abi/extern/extern-pass-FiveU16s.rs
Erik Desjardins 4498cd6a8d extend extern tests to include FiveU16s
As described in the code, this extends just beyond a 64bit reg, but
isn't a round number, so it triggers some edge cases in the cast ABI.
2024-03-17 00:07:42 -04:00

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);
}
}