112a9d9c8Sopenharmony_ci#![allow(
212a9d9c8Sopenharmony_ci    dead_code,
312a9d9c8Sopenharmony_ci    non_snake_case,
412a9d9c8Sopenharmony_ci    non_camel_case_types,
512a9d9c8Sopenharmony_ci    non_upper_case_globals
612a9d9c8Sopenharmony_ci)]
712a9d9c8Sopenharmony_ci
812a9d9c8Sopenharmony_ci/// We emit a `[u8; 63usize]` padding field for this struct, which cannot derive
912a9d9c8Sopenharmony_ci/// Debug/Hash because 63 is over the hard coded limit.
1012a9d9c8Sopenharmony_ci#[repr(C)]
1112a9d9c8Sopenharmony_ci#[repr(align(64))]
1212a9d9c8Sopenharmony_ci#[derive(Copy, Clone)]
1312a9d9c8Sopenharmony_cipub struct NoDebug {
1412a9d9c8Sopenharmony_ci    pub c: ::std::os::raw::c_char,
1512a9d9c8Sopenharmony_ci}
1612a9d9c8Sopenharmony_ci#[test]
1712a9d9c8Sopenharmony_cifn bindgen_test_layout_NoDebug() {
1812a9d9c8Sopenharmony_ci    const UNINIT: ::std::mem::MaybeUninit<NoDebug> =
1912a9d9c8Sopenharmony_ci        ::std::mem::MaybeUninit::uninit();
2012a9d9c8Sopenharmony_ci    let ptr = UNINIT.as_ptr();
2112a9d9c8Sopenharmony_ci    assert_eq!(
2212a9d9c8Sopenharmony_ci        ::std::mem::size_of::<NoDebug>(),
2312a9d9c8Sopenharmony_ci        64usize,
2412a9d9c8Sopenharmony_ci        concat!("Size of: ", stringify!(NoDebug))
2512a9d9c8Sopenharmony_ci    );
2612a9d9c8Sopenharmony_ci    assert_eq!(
2712a9d9c8Sopenharmony_ci        ::std::mem::align_of::<NoDebug>(),
2812a9d9c8Sopenharmony_ci        64usize,
2912a9d9c8Sopenharmony_ci        concat!("Alignment of ", stringify!(NoDebug))
3012a9d9c8Sopenharmony_ci    );
3112a9d9c8Sopenharmony_ci    assert_eq!(
3212a9d9c8Sopenharmony_ci        unsafe { ::std::ptr::addr_of!((*ptr).c) as usize - ptr as usize },
3312a9d9c8Sopenharmony_ci        0usize,
3412a9d9c8Sopenharmony_ci        concat!(
3512a9d9c8Sopenharmony_ci            "Offset of field: ",
3612a9d9c8Sopenharmony_ci            stringify!(NoDebug),
3712a9d9c8Sopenharmony_ci            "::",
3812a9d9c8Sopenharmony_ci            stringify!(c)
3912a9d9c8Sopenharmony_ci        )
4012a9d9c8Sopenharmony_ci    );
4112a9d9c8Sopenharmony_ci}
4212a9d9c8Sopenharmony_ciimpl Default for NoDebug {
4312a9d9c8Sopenharmony_ci    fn default() -> Self {
4412a9d9c8Sopenharmony_ci        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
4512a9d9c8Sopenharmony_ci        unsafe {
4612a9d9c8Sopenharmony_ci            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
4712a9d9c8Sopenharmony_ci            s.assume_init()
4812a9d9c8Sopenharmony_ci        }
4912a9d9c8Sopenharmony_ci    }
5012a9d9c8Sopenharmony_ci}
5112a9d9c8Sopenharmony_ciimpl ::std::cmp::PartialEq for NoDebug {
5212a9d9c8Sopenharmony_ci    fn eq(&self, other: &NoDebug) -> bool {
5312a9d9c8Sopenharmony_ci        self.c == other.c
5412a9d9c8Sopenharmony_ci    }
5512a9d9c8Sopenharmony_ci}
5612a9d9c8Sopenharmony_ci/// This should derive Debug/Hash/PartialEq/Eq because the padding size is less than the max derive
5712a9d9c8Sopenharmony_ci/// Debug/Hash/PartialEq/Eq impl for arrays. However, we conservatively don't derive Debug/Hash because
5812a9d9c8Sopenharmony_ci/// we determine Debug derive-ability before we compute padding, which happens at
5912a9d9c8Sopenharmony_ci/// codegen.
6012a9d9c8Sopenharmony_ci#[repr(C)]
6112a9d9c8Sopenharmony_ci#[repr(align(64))]
6212a9d9c8Sopenharmony_ci#[derive(Copy, Clone)]
6312a9d9c8Sopenharmony_cipub struct ShouldDeriveDebugButDoesNot {
6412a9d9c8Sopenharmony_ci    pub c: [::std::os::raw::c_char; 32usize],
6512a9d9c8Sopenharmony_ci    pub d: ::std::os::raw::c_char,
6612a9d9c8Sopenharmony_ci}
6712a9d9c8Sopenharmony_ci#[test]
6812a9d9c8Sopenharmony_cifn bindgen_test_layout_ShouldDeriveDebugButDoesNot() {
6912a9d9c8Sopenharmony_ci    const UNINIT: ::std::mem::MaybeUninit<ShouldDeriveDebugButDoesNot> =
7012a9d9c8Sopenharmony_ci        ::std::mem::MaybeUninit::uninit();
7112a9d9c8Sopenharmony_ci    let ptr = UNINIT.as_ptr();
7212a9d9c8Sopenharmony_ci    assert_eq!(
7312a9d9c8Sopenharmony_ci        ::std::mem::size_of::<ShouldDeriveDebugButDoesNot>(),
7412a9d9c8Sopenharmony_ci        64usize,
7512a9d9c8Sopenharmony_ci        concat!("Size of: ", stringify!(ShouldDeriveDebugButDoesNot))
7612a9d9c8Sopenharmony_ci    );
7712a9d9c8Sopenharmony_ci    assert_eq!(
7812a9d9c8Sopenharmony_ci        ::std::mem::align_of::<ShouldDeriveDebugButDoesNot>(),
7912a9d9c8Sopenharmony_ci        64usize,
8012a9d9c8Sopenharmony_ci        concat!("Alignment of ", stringify!(ShouldDeriveDebugButDoesNot))
8112a9d9c8Sopenharmony_ci    );
8212a9d9c8Sopenharmony_ci    assert_eq!(
8312a9d9c8Sopenharmony_ci        unsafe { ::std::ptr::addr_of!((*ptr).c) as usize - ptr as usize },
8412a9d9c8Sopenharmony_ci        0usize,
8512a9d9c8Sopenharmony_ci        concat!(
8612a9d9c8Sopenharmony_ci            "Offset of field: ",
8712a9d9c8Sopenharmony_ci            stringify!(ShouldDeriveDebugButDoesNot),
8812a9d9c8Sopenharmony_ci            "::",
8912a9d9c8Sopenharmony_ci            stringify!(c)
9012a9d9c8Sopenharmony_ci        )
9112a9d9c8Sopenharmony_ci    );
9212a9d9c8Sopenharmony_ci    assert_eq!(
9312a9d9c8Sopenharmony_ci        unsafe { ::std::ptr::addr_of!((*ptr).d) as usize - ptr as usize },
9412a9d9c8Sopenharmony_ci        32usize,
9512a9d9c8Sopenharmony_ci        concat!(
9612a9d9c8Sopenharmony_ci            "Offset of field: ",
9712a9d9c8Sopenharmony_ci            stringify!(ShouldDeriveDebugButDoesNot),
9812a9d9c8Sopenharmony_ci            "::",
9912a9d9c8Sopenharmony_ci            stringify!(d)
10012a9d9c8Sopenharmony_ci        )
10112a9d9c8Sopenharmony_ci    );
10212a9d9c8Sopenharmony_ci}
10312a9d9c8Sopenharmony_ciimpl Default for ShouldDeriveDebugButDoesNot {
10412a9d9c8Sopenharmony_ci    fn default() -> Self {
10512a9d9c8Sopenharmony_ci        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
10612a9d9c8Sopenharmony_ci        unsafe {
10712a9d9c8Sopenharmony_ci            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
10812a9d9c8Sopenharmony_ci            s.assume_init()
10912a9d9c8Sopenharmony_ci        }
11012a9d9c8Sopenharmony_ci    }
11112a9d9c8Sopenharmony_ci}
11212a9d9c8Sopenharmony_ciimpl ::std::cmp::PartialEq for ShouldDeriveDebugButDoesNot {
11312a9d9c8Sopenharmony_ci    fn eq(&self, other: &ShouldDeriveDebugButDoesNot) -> bool {
11412a9d9c8Sopenharmony_ci        self.c == other.c && self.d == other.d
11512a9d9c8Sopenharmony_ci    }
11612a9d9c8Sopenharmony_ci}
117