cbindgen/tests/rust/layout.rs
Aleksa Sarai f23d4ee6e8 tests: add tests for #[repr(packed)] and #[repr(align(...))]
The tests are very straightforward, and effecitvely are just ensuring
that the formatting works correctly and is included in all of the
important cases.

It's also very important to ensure we do not generate laid-out structs
for layouts which we cannot reasonably represent in C (such as in cases
where we weren't told what annotation to use for packed and
specifically-aligned structures). Thus, add some tests to verify that
this is the case.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
2019-12-15 11:52:23 +01:00

109 lines
1.9 KiB
Rust

#[repr(align(1), C)]
pub struct Align1Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
#[repr(align(2), C)]
pub struct Align2Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
#[repr(align(4), C)]
pub struct Align4Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
#[repr(align(8), C)]
pub struct Align8Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
#[repr(align(32), C)]
pub struct Align32Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
#[repr(packed, C)]
pub struct PackedStruct {
pub arg1: usize,
pub arg2: *mut u8,
}
#[repr(align(1), C)]
pub union Align1Union {
pub variant1: usize,
pub variant2: *mut u8,
}
#[repr(align(4), C)]
pub union Align4Union {
pub variant1: usize,
pub variant2: *mut u8,
}
#[repr(align(16), C)]
pub union Align16Union {
pub variant1: usize,
pub variant2: *mut u8,
}
#[repr(packed, C)]
pub union PackedUnion {
pub variant1: usize,
pub variant2: *mut u8,
}
// #[repr(packed(n), C)] structs are currently unsupported.
#[repr(packed(4), C)]
pub struct UnsupportedPacked4Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
// #[repr(packed(n), C)] unions are currently unsupported.
#[repr(packed(4), C)]
pub union UnsupportedPacked4Union {
pub variant1: usize,
pub variant2: *mut u8,
}
// #[repr(align(n), C)] enums are currently unsupported.
#[repr(align(4), C)]
pub enum UnsupportedAlign4Enum {
Variant1,
Variant2,
}
// Non-repr(C) structs aren't translated.
#[repr(align(4))]
pub struct RustAlign4Struct {
pub arg1: usize,
pub arg2: *mut u8,
}
// Non-repr(C) structs aren't translated.
#[repr(packed)]
pub struct RustPackedStruct {
pub arg1: usize,
pub arg2: *mut u8,
}
// Non-repr(C) unions aren't translated.
#[repr(align(4))]
pub struct RustAlign4Union {
pub arg1: usize,
pub arg2: *mut u8,
}
// Non-repr(C) unions aren't translated.
#[repr(packed)]
pub struct RustPackedUnion {
pub arg1: usize,
pub arg2: *mut u8,
}