#![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))
    );
}
