diff --git a/bindgen-tests/tests/expectations/tests/anon_union.rs b/bindgen-tests/tests/expectations/tests/anon_union.rs index d9bf3cf183..8a5891bed0 100644 --- a/bindgen-tests/tests/expectations/tests/anon_union.rs +++ b/bindgen-tests/tests/expectations/tests/anon_union.rs @@ -15,12 +15,12 @@ pub enum TErrorResult_UnionState { HasMessage = 0, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct TErrorResult_Message { _unused: [u8; 0], } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct TErrorResult_DOMExceptionInfo { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/forward-declaration-autoptr.rs b/bindgen-tests/tests/expectations/tests/forward-declaration-autoptr.rs index b74b408841..aeb2b7b4e5 100644 --- a/bindgen-tests/tests/expectations/tests/forward-declaration-autoptr.rs +++ b/bindgen-tests/tests/expectations/tests/forward-declaration-autoptr.rs @@ -1,6 +1,6 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct Foo { _unused: [u8; 0], } @@ -20,7 +20,7 @@ impl Default for RefPtr { } } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct Bar { pub m_member: RefPtr, } diff --git a/bindgen-tests/tests/expectations/tests/forward_declared_complex_types.rs b/bindgen-tests/tests/expectations/tests/forward_declared_complex_types.rs index 79554d58e4..89cf957633 100644 --- a/bindgen-tests/tests/expectations/tests/forward_declared_complex_types.rs +++ b/bindgen-tests/tests/expectations/tests/forward_declared_complex_types.rs @@ -10,7 +10,7 @@ const _: () = { ["Alignment of Foo_empty"][::std::mem::align_of::() - 1usize]; }; #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct Foo { _unused: [u8; 0], } @@ -39,7 +39,7 @@ unsafe extern "C" { pub fn baz_struct(f: *mut Foo); } #[repr(C)] -#[derive(Copy, Clone)] +#[derive(Debug)] pub struct Union { _unused: [u8; 0], } @@ -48,7 +48,7 @@ unsafe extern "C" { pub fn baz_union(u: *mut Union); } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct Quux { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/forward_declared_opaque.rs b/bindgen-tests/tests/expectations/tests/forward_declared_opaque.rs index 1f92194045..5c3a1f5412 100644 --- a/bindgen-tests/tests/expectations/tests/forward_declared_opaque.rs +++ b/bindgen-tests/tests/expectations/tests/forward_declared_opaque.rs @@ -1,11 +1,11 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Copy, Clone)] +#[derive(Debug)] pub struct a { _unused: [u8; 0], } #[repr(C)] -#[derive(Debug, Default, Copy, Clone)] +#[derive(Debug)] pub struct b { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/func_return_must_use.rs b/bindgen-tests/tests/expectations/tests/func_return_must_use.rs index 904c71cbe3..9a4293c458 100644 --- a/bindgen-tests/tests/expectations/tests/func_return_must_use.rs +++ b/bindgen-tests/tests/expectations/tests/func_return_must_use.rs @@ -5,11 +5,19 @@ unsafe extern "C" { pub fn return_int() -> MustUseInt; } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] #[must_use] pub struct MustUseStruct { - _unused: [u8; 0], + pub a: ::std::os::raw::c_int, } +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of MustUseStruct"][::std::mem::size_of::() - 4usize]; + ["Alignment of MustUseStruct"][::std::mem::align_of::() - 4usize]; + [ + "Offset of field: MustUseStruct::a", + ][::std::mem::offset_of!(MustUseStruct, a) - 0usize]; +}; unsafe extern "C" { #[must_use] pub fn return_struct() -> MustUseStruct; @@ -27,11 +35,16 @@ unsafe extern "C" { #[repr(C)] #[derive(Debug, Default, Copy, Clone)] #[must_use] -pub struct AnnotatedStruct {} +pub struct AnnotatedStruct { + pub a: ::std::os::raw::c_int, +} #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { - ["Size of AnnotatedStruct"][::std::mem::size_of::() - 0usize]; - ["Alignment of AnnotatedStruct"][::std::mem::align_of::() - 1usize]; + ["Size of AnnotatedStruct"][::std::mem::size_of::() - 4usize]; + ["Alignment of AnnotatedStruct"][::std::mem::align_of::() - 4usize]; + [ + "Offset of field: AnnotatedStruct::a", + ][::std::mem::offset_of!(AnnotatedStruct, a) - 0usize]; }; unsafe extern "C" { #[must_use] @@ -39,11 +52,14 @@ unsafe extern "C" { } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct PlainStruct {} +pub struct PlainStruct { + pub a: ::std::os::raw::c_int, +} #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { - ["Size of PlainStruct"][::std::mem::size_of::() - 0usize]; - ["Alignment of PlainStruct"][::std::mem::align_of::() - 1usize]; + ["Size of PlainStruct"][::std::mem::size_of::() - 4usize]; + ["Alignment of PlainStruct"][::std::mem::align_of::() - 4usize]; + ["Offset of field: PlainStruct::a"][::std::mem::offset_of!(PlainStruct, a) - 0usize]; }; ///
pub type TypedefPlainStruct = PlainStruct; diff --git a/bindgen-tests/tests/expectations/tests/issue-1443.rs b/bindgen-tests/tests/expectations/tests/issue-1443.rs index ee1ffca8e5..e1617582d3 100644 --- a/bindgen-tests/tests/expectations/tests/issue-1443.rs +++ b/bindgen-tests/tests/expectations/tests/issue-1443.rs @@ -1,6 +1,6 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct Foo { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/issue-654-struct-fn-collision.rs b/bindgen-tests/tests/expectations/tests/issue-654-struct-fn-collision.rs index 6bf02be74e..bd670a00f2 100644 --- a/bindgen-tests/tests/expectations/tests/issue-654-struct-fn-collision.rs +++ b/bindgen-tests/tests/expectations/tests/issue-654-struct-fn-collision.rs @@ -1,6 +1,6 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct foo { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/issue-710-must-use-type.rs b/bindgen-tests/tests/expectations/tests/issue-710-must-use-type.rs index d7006dd011..25da6eb498 100644 --- a/bindgen-tests/tests/expectations/tests/issue-710-must-use-type.rs +++ b/bindgen-tests/tests/expectations/tests/issue-710-must-use-type.rs @@ -1,19 +1,19 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] #[must_use] pub struct A { _unused: [u8; 0], } ///
#[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] #[must_use] pub struct B { _unused: [u8; 0], } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct C { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/issue-801-opaque-sloppiness.rs b/bindgen-tests/tests/expectations/tests/issue-801-opaque-sloppiness.rs index 90eb048640..50bc573fc4 100644 --- a/bindgen-tests/tests/expectations/tests/issue-801-opaque-sloppiness.rs +++ b/bindgen-tests/tests/expectations/tests/issue-801-opaque-sloppiness.rs @@ -1,6 +1,6 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct A { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/layout_array.rs b/bindgen-tests/tests/expectations/tests/layout_array.rs index b910159beb..b0654815d6 100644 --- a/bindgen-tests/tests/expectations/tests/layout_array.rs +++ b/bindgen-tests/tests/expectations/tests/layout_array.rs @@ -4,7 +4,7 @@ pub const RTE_MEMPOOL_OPS_NAMESIZE: u32 = 32; pub const RTE_MEMPOOL_MAX_OPS_IDX: u32 = 16; pub const RTE_HEAP_NUM_FREELISTS: u32 = 13; #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct rte_mempool { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/operator.rs b/bindgen-tests/tests/expectations/tests/operator.rs index ce5a652d8d..1a5a6859a2 100644 --- a/bindgen-tests/tests/expectations/tests/operator.rs +++ b/bindgen-tests/tests/expectations/tests/operator.rs @@ -4,7 +4,7 @@ unsafe extern "C" { pub fn operator_information() -> ::std::os::raw::c_int; } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct Foo { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/parm-union.rs b/bindgen-tests/tests/expectations/tests/parm-union.rs index 6dee4ec7d5..1a4f654038 100644 --- a/bindgen-tests/tests/expectations/tests/parm-union.rs +++ b/bindgen-tests/tests/expectations/tests/parm-union.rs @@ -20,7 +20,7 @@ impl Struct { } } #[repr(C)] -#[derive(Copy, Clone)] +#[derive(Debug)] pub struct Union { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/bindgen-tests/tests/expectations/tests/same_struct_name_in_different_namespaces.rs index e6e4088abf..b7dd3a579f 100644 --- a/bindgen-tests/tests/expectations/tests/same_struct_name_in_different_namespaces.rs +++ b/bindgen-tests/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -1,6 +1,6 @@ #![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct JS_Zone { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/template.rs b/bindgen-tests/tests/expectations/tests/template.rs index 94678cb49e..b1beae9930 100644 --- a/bindgen-tests/tests/expectations/tests/template.rs +++ b/bindgen-tests/tests/expectations/tests/template.rs @@ -36,7 +36,7 @@ unsafe extern "C" { pub fn bar(foo: Foo<::std::os::raw::c_int>); } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct mozilla_Foo { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/typedef-pointer-overlap.rs b/bindgen-tests/tests/expectations/tests/typedef-pointer-overlap.rs index 122059b4e1..1579b6ddf7 100644 --- a/bindgen-tests/tests/expectations/tests/typedef-pointer-overlap.rs +++ b/bindgen-tests/tests/expectations/tests/typedef-pointer-overlap.rs @@ -24,7 +24,7 @@ const _: () = { }; pub type bar_ptr = *mut bar; #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct baz { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/expectations/tests/wrap-static-fns.rs b/bindgen-tests/tests/expectations/tests/wrap-static-fns.rs index bafcad8a7e..4c13c365ea 100644 --- a/bindgen-tests/tests/expectations/tests/wrap-static-fns.rs +++ b/bindgen-tests/tests/expectations/tests/wrap-static-fns.rs @@ -81,7 +81,7 @@ unsafe extern "C" { } pub type __builtin_va_list = [__va_list_tag; 1usize]; #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct __va_list_tag { pub gp_offset: ::std::os::raw::c_uint, pub fp_offset: ::std::os::raw::c_uint, diff --git a/bindgen-tests/tests/expectations/tests/wrap_unsafe_ops_anon_union.rs b/bindgen-tests/tests/expectations/tests/wrap_unsafe_ops_anon_union.rs index 50cefed043..20bbf9037c 100644 --- a/bindgen-tests/tests/expectations/tests/wrap_unsafe_ops_anon_union.rs +++ b/bindgen-tests/tests/expectations/tests/wrap_unsafe_ops_anon_union.rs @@ -10,12 +10,12 @@ pub const TErrorResult_UnionState_HasMessage: TErrorResult_UnionState = 0; pub const TErrorResult_UnionState_HasException: TErrorResult_UnionState = 0; pub type TErrorResult_UnionState = i32; #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct TErrorResult_Message { _unused: [u8; 0], } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug)] pub struct TErrorResult_DOMExceptionInfo { _unused: [u8; 0], } diff --git a/bindgen-tests/tests/headers/func_return_must_use.h b/bindgen-tests/tests/headers/func_return_must_use.h index f05bd2de40..da727fe559 100644 --- a/bindgen-tests/tests/headers/func_return_must_use.h +++ b/bindgen-tests/tests/headers/func_return_must_use.h @@ -4,7 +4,9 @@ typedef int MustUseInt; MustUseInt return_int(); -struct MustUseStruct; +struct MustUseStruct { + int a; +}; struct MustUseStruct return_struct(); @@ -20,11 +22,15 @@ int return_plain_int(); /** *
*/ -struct AnnotatedStruct {}; +struct AnnotatedStruct { + int a; +}; struct AnnotatedStruct return_annotated_struct(); -struct PlainStruct {}; +struct PlainStruct { + int a; +}; /** *
diff --git a/bindgen-tests/tests/headers/issue-1238-fwd-no-copy.h b/bindgen-tests/tests/headers/issue-1238-fwd-no-copy.h index 150bbbeb77..dba7ab1462 100644 --- a/bindgen-tests/tests/headers/issue-1238-fwd-no-copy.h +++ b/bindgen-tests/tests/headers/issue-1238-fwd-no-copy.h @@ -1,3 +1,2 @@ -// bindgen-flags: --no-copy MyType typedef struct MyType MyTypeT; diff --git a/bindgen/codegen/mod.rs b/bindgen/codegen/mod.rs index f58a234117..84b7aa46d3 100644 --- a/bindgen/codegen/mod.rs +++ b/bindgen/codegen/mod.rs @@ -2444,7 +2444,17 @@ impl CodeGenerator for CompInfo { } } - let derivable_traits = derives_of_item(item, ctx, packed); + let derivable_traits = if self.is_forward_declaration() { + // The only trait we can derive for forward declared types is `Debug`, + // since we don't know anything about the layout or type. + let mut derivable_traits = DerivableTraits::empty(); + if !item.annotations().disallow_debug() { + derivable_traits |= DerivableTraits::DEBUG; + }; + derivable_traits + } else { + derives_of_item(item, ctx, packed) + }; if !derivable_traits.contains(DerivableTraits::DEBUG) { needs_debug_impl = ctx.options().derive_debug && ctx.options().impl_debug && diff --git a/bindgen/ir/analysis/derive.rs b/bindgen/ir/analysis/derive.rs index 6c66998bee..3e216b1f0b 100644 --- a/bindgen/ir/analysis/derive.rs +++ b/bindgen/ir/analysis/derive.rs @@ -510,7 +510,7 @@ impl DeriveTrait { } fn can_derive_compound_forward_decl(self) -> bool { - matches!(self, DeriveTrait::Copy | DeriveTrait::Debug) + matches!(self, DeriveTrait::Debug) } fn can_derive_incomplete_array(self) -> bool {