cbindgen/tests/rust/layout_packed_opaque.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

62 lines
1.0 KiB
Rust

#[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(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,
}
// Opaque because packed is not defined.
#[repr(packed, C)]
pub struct OpaquePackedStruct {
pub arg1: usize,
pub arg2: *mut u8,
}
// Opaque because packed is not defined.
#[repr(packed, C)]
pub union OpaquePackedUnion {
pub variant1: usize,
pub variant2: *mut u8,
}