diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2019-03-26 01:06:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-26 01:06:19 +0100 |
commit | b59419a3f4a8277920bce9d6ad3c0597216faa1c (patch) | |
tree | a74f47af4049453304044bc0d819575143d2b47d | |
parent | d6998132429e287a540633b75ff6ce44facc4dd0 (diff) | |
parent | 76d1959cb51b32e9bd2092bb87985b64158dd433 (diff) |
Merge pull request #1492 from emilio/non-recursive-derive
ir: Whitelist items that don't generate code to improve derive behavior.
-rw-r--r-- | src/codegen/mod.rs | 2 | ||||
-rw-r--r-- | src/ir/context.rs | 22 | ||||
-rw-r--r-- | tests/expectations/tests/issue-1285.rs | 53 | ||||
-rw-r--r-- | tests/expectations/tests/no-recursive-whitelisting.rs | 9 |
4 files changed, 37 insertions, 49 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 0956eb7a..8d1327b3 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -610,6 +610,8 @@ impl CodeGenerator for Type { TypeKind::TypeParam => { // These items don't need code generation, they only need to be // converted to rust types in fields, arguments, and such. + // NOTE(emilio): If you add to this list, make sure to also add + // it to BindgenContext::compute_whitelisted_and_codegen_items. return; } TypeKind::TemplateInstantiation(ref inst) => { diff --git a/src/ir/context.rs b/src/ir/context.rs index 914a89b2..0fe720f9 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -2314,6 +2314,28 @@ If you encounter an error missing from this list, please file an issue or a PR!" return true; } + // Auto-whitelist types that don't need code + // generation if not whitelisting recursively, to + // make the #[derive] analysis not be lame. + if !self.options().whitelist_recursively { + match *ty.kind() { + TypeKind::Void | + TypeKind::NullPtr | + TypeKind::Int(..) | + TypeKind::Float(..) | + TypeKind::Complex(..) | + TypeKind::Array(..) | + TypeKind::Vector(..) | + TypeKind::Pointer(..) | + TypeKind::Reference(..) | + TypeKind::Function(..) | + TypeKind::ResolvedTypeRef(..) | + TypeKind::Opaque | + TypeKind::TypeParam => return true, + _ => {}, + }; + } + // Unnamed top-level enums are special and we // whitelist them via the `whitelisted_vars` filter, // since they're effectively top-level constants, diff --git a/tests/expectations/tests/issue-1285.rs b/tests/expectations/tests/issue-1285.rs index 8497c3f2..d0328d34 100644 --- a/tests/expectations/tests/issue-1285.rs +++ b/tests/expectations/tests/issue-1285.rs @@ -8,57 +8,16 @@ )] #[repr(C)] -pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>); -impl<T> __BindgenUnionField<T> { - #[inline] - pub fn new() -> Self { - __BindgenUnionField(::std::marker::PhantomData) - } - #[inline] - pub unsafe fn as_ref(&self) -> &T { - ::std::mem::transmute(self) - } - #[inline] - pub unsafe fn as_mut(&mut self) -> &mut T { - ::std::mem::transmute(self) - } -} -impl<T> ::std::default::Default for __BindgenUnionField<T> { - #[inline] - fn default() -> Self { - Self::new() - } -} -impl<T> ::std::clone::Clone for __BindgenUnionField<T> { - #[inline] - fn clone(&self) -> Self { - Self::new() - } -} -impl<T> ::std::marker::Copy for __BindgenUnionField<T> {} -impl<T> ::std::fmt::Debug for __BindgenUnionField<T> { - fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - fmt.write_str("__BindgenUnionField") - } -} -impl<T> ::std::hash::Hash for __BindgenUnionField<T> { - fn hash<H: ::std::hash::Hasher>(&self, _state: &mut H) {} -} -impl<T> ::std::cmp::PartialEq for __BindgenUnionField<T> { - fn eq(&self, _other: &__BindgenUnionField<T>) -> bool { - true - } -} -impl<T> ::std::cmp::Eq for __BindgenUnionField<T> {} -#[repr(C)] +#[derive(Copy, Clone)] pub struct foo { pub bar: foo__bindgen_ty_1, } #[repr(C)] -pub struct foo__bindgen_ty_1 { - pub a: __BindgenUnionField<::std::os::raw::c_uint>, - pub b: __BindgenUnionField<::std::os::raw::c_ushort>, - pub bindgen_union_field: u32, +#[derive(Copy, Clone)] +pub union foo__bindgen_ty_1 { + pub a: ::std::os::raw::c_uint, + pub b: ::std::os::raw::c_ushort, + _bindgen_union_align: u32, } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { diff --git a/tests/expectations/tests/no-recursive-whitelisting.rs b/tests/expectations/tests/no-recursive-whitelisting.rs index e8fb6944..e7e71efc 100644 --- a/tests/expectations/tests/no-recursive-whitelisting.rs +++ b/tests/expectations/tests/no-recursive-whitelisting.rs @@ -1,11 +1,16 @@ /* automatically generated by rust-bindgen */ - -#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] pub enum Bar {} #[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct Foo { pub baz: *mut Bar, } |