blob: a0387cd9d0828610bc82d0b5c4b1cef4fdc691e6 [file] [log] [blame]
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
/** This should not be opaque; we can see the attributes and can pack the
struct.*/
#[repr(C, packed)]
#[derive(Debug, Default, Copy, Clone)]
pub struct AlignedToOne {
pub i: ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout_AlignedToOne() {
const UNINIT: ::std::mem::MaybeUninit<AlignedToOne> = ::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of:: < AlignedToOne > (), 4usize, concat!("Size of: ",
stringify!(AlignedToOne))
);
assert_eq!(
::std::mem::align_of:: < AlignedToOne > (), 1usize, concat!("Alignment of ",
stringify!(AlignedToOne))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((* ptr).i) as usize - ptr as usize }, 0usize,
concat!("Offset of field: ", stringify!(AlignedToOne), "::", stringify!(i))
);
}
/** This should be opaque because although we can see the attributes, Rust before
1.33 doesn't have `#[repr(packed(N))]`.*/
#[repr(C, packed(2))]
#[derive(Debug, Default, Copy, Clone)]
pub struct AlignedToTwo {
pub i: ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout_AlignedToTwo() {
const UNINIT: ::std::mem::MaybeUninit<AlignedToTwo> = ::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of:: < AlignedToTwo > (), 4usize, concat!("Size of: ",
stringify!(AlignedToTwo))
);
assert_eq!(
::std::mem::align_of:: < AlignedToTwo > (), 2usize, concat!("Alignment of ",
stringify!(AlignedToTwo))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((* ptr).i) as usize - ptr as usize }, 0usize,
concat!("Offset of field: ", stringify!(AlignedToTwo), "::", stringify!(i))
);
}
/** This should not be opaque because although `libclang` doesn't give us the
`#pragma pack(1)`, we can detect that alignment is 1 and add
`#[repr(packed)]` to the struct ourselves.*/
#[repr(C, packed)]
#[derive(Debug, Default, Copy, Clone)]
pub struct PackedToOne {
pub x: ::std::os::raw::c_int,
pub y: ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout_PackedToOne() {
const UNINIT: ::std::mem::MaybeUninit<PackedToOne> = ::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of:: < PackedToOne > (), 8usize, concat!("Size of: ",
stringify!(PackedToOne))
);
assert_eq!(
::std::mem::align_of:: < PackedToOne > (), 1usize, concat!("Alignment of ",
stringify!(PackedToOne))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((* ptr).x) as usize - ptr as usize }, 0usize,
concat!("Offset of field: ", stringify!(PackedToOne), "::", stringify!(x))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((* ptr).y) as usize - ptr as usize }, 4usize,
concat!("Offset of field: ", stringify!(PackedToOne), "::", stringify!(y))
);
}
/** In this case, even if we can detect the weird alignment triggered by
`#pragma pack(2)`, we can't do anything about it because Rust before 1.33
doesn't have `#[repr(packed(N))]`. Therefore, we must make it opaque.*/
#[repr(C, packed(2))]
#[derive(Debug, Default, Copy, Clone)]
pub struct PackedToTwo {
pub x: ::std::os::raw::c_int,
pub y: ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout_PackedToTwo() {
const UNINIT: ::std::mem::MaybeUninit<PackedToTwo> = ::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of:: < PackedToTwo > (), 8usize, concat!("Size of: ",
stringify!(PackedToTwo))
);
assert_eq!(
::std::mem::align_of:: < PackedToTwo > (), 2usize, concat!("Alignment of ",
stringify!(PackedToTwo))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((* ptr).x) as usize - ptr as usize }, 0usize,
concat!("Offset of field: ", stringify!(PackedToTwo), "::", stringify!(x))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((* ptr).y) as usize - ptr as usize }, 4usize,
concat!("Offset of field: ", stringify!(PackedToTwo), "::", stringify!(y))
);
}