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