diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-09-06 14:46:33 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-06 14:46:33 -0500 |
commit | 1e49750a4effcc1d773e667aabf821dde2cebfab (patch) | |
tree | 927c8aefc7cea1b9110aaa581c675bed5676c9dc | |
parent | b209d42444dd3dbe3b57590313d4f47979225492 (diff) | |
parent | 537a49ef5268c9d6546e84579c3c5441652da1e5 (diff) |
Auto merge of #952 - mchlrhw:master, r=fitzgen
Add `bindgen::Builder::derive_copy`
Fixes https://github.com/rust-lang-nursery/rust-bindgen/issues/948
-rw-r--r-- | src/codegen/mod.rs | 4 | ||||
-rw-r--r-- | src/lib.rs | 15 | ||||
-rw-r--r-- | src/options.rs | 7 | ||||
-rw-r--r-- | tests/expectations/tests/do-not-derive-copy.rs | 28 | ||||
-rw-r--r-- | tests/headers/do-not-derive-copy.hpp | 5 |
5 files changed, 58 insertions, 1 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index f47787af..4697ba21 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1493,7 +1493,9 @@ impl CodeGenerator for CompInfo { needs_default_impl = ctx.options().derive_default; } - if item.can_derive_copy(ctx) && !item.annotations().disallow_copy() { + if item.can_derive_copy(ctx) && !item.annotations().disallow_copy() && + ctx.options().derive_copy + { derives.push("Copy"); if used_template_params.is_some() { // FIXME: This requires extra logic if you have a big array in a @@ -253,6 +253,10 @@ impl Builder { output_vector.push("--no-layout-tests".into()); } + if !self.options.derive_copy { + output_vector.push("--no-derive-copy".into()); + } + if !self.options.derive_debug { output_vector.push("--no-derive-debug".into()); } @@ -735,6 +739,12 @@ impl Builder { self } + /// Set whether `Copy` should be derived by default. + pub fn derive_copy(mut self, doit: bool) -> Self { + self.options.derive_copy = doit; + self + } + /// Set whether `Debug` should be derived by default. pub fn derive_debug(mut self, doit: bool) -> Self { self.options.derive_debug = doit; @@ -1104,6 +1114,10 @@ pub struct BindgenOptions { /// True if we should generate layout tests for generated structures. pub layout_tests: bool, + /// True if we should derive Copy trait implementations for C/C++ structures + /// and types. + pub derive_copy: bool, + /// True if we should derive Debug trait implementations for C/C++ structures /// and types. pub derive_debug: bool, @@ -1269,6 +1283,7 @@ impl Default for BindgenOptions { emit_ir: false, emit_ir_graphviz: None, layout_tests: true, + derive_copy: true, derive_debug: true, impl_debug: false, derive_default: false, diff --git a/src/options.rs b/src/options.rs index c6f5c010..aaf31953 100644 --- a/src/options.rs +++ b/src/options.rs @@ -61,6 +61,9 @@ where Arg::with_name("no-layout-tests") .long("no-layout-tests") .help("Avoid generating layout tests for any type."), + Arg::with_name("no-derive-copy") + .long("no-derive-copy") + .help("Avoid deriving Copy on any type."), Arg::with_name("no-derive-debug") .long("no-derive-debug") .help("Avoid deriving Debug on any type."), @@ -311,6 +314,10 @@ where builder = builder.layout_tests(false); } + if matches.is_present("no-derive-copy") { + builder = builder.derive_copy(false); + } + if matches.is_present("no-derive-debug") { builder = builder.derive_debug(false); } diff --git a/tests/expectations/tests/do-not-derive-copy.rs b/tests/expectations/tests/do-not-derive-copy.rs new file mode 100644 index 00000000..114b73e3 --- /dev/null +++ b/tests/expectations/tests/do-not-derive-copy.rs @@ -0,0 +1,28 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] + + +#[repr(C)] +#[derive(Debug, Default)] +pub struct WouldBeCopyButWeAreNotDerivingCopy { + pub x: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_WouldBeCopyButWeAreNotDerivingCopy() { + assert_eq!(::std::mem::size_of::<WouldBeCopyButWeAreNotDerivingCopy>() , + 4usize , concat ! ( + "Size of: " , stringify ! ( WouldBeCopyButWeAreNotDerivingCopy + ) )); + assert_eq! (::std::mem::align_of::<WouldBeCopyButWeAreNotDerivingCopy>() , + 4usize , concat ! ( + "Alignment of " , stringify ! ( + WouldBeCopyButWeAreNotDerivingCopy ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const WouldBeCopyButWeAreNotDerivingCopy ) ) . + x as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + WouldBeCopyButWeAreNotDerivingCopy ) , "::" , stringify ! ( x + ) )); +} diff --git a/tests/headers/do-not-derive-copy.hpp b/tests/headers/do-not-derive-copy.hpp new file mode 100644 index 00000000..18c26135 --- /dev/null +++ b/tests/headers/do-not-derive-copy.hpp @@ -0,0 +1,5 @@ +// bindgen-flags: --no-derive-copy + +class WouldBeCopyButWeAreNotDerivingCopy { + int x; +}; |