diff --git a/CHANGELOG.md b/CHANGELOG.md index 9027e464dd..74a9371a76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,14 @@ - [Removed](#removed) - [Fixed](#fixed) - [Security](#security) -- [0.53.0](#0530) +- [0.53.1](#0531) - [Added](#added-1) +- [0.53.0](#0530) + - [Added](#added-2) - [Changed](#changed-1) - [Fixed](#fixed-1) - [0.52.0](#0520) - - [Added](#added-2) + - [Added](#added-3) - [Changed](#changed-2) - [Fixed](#fixed-2) - [0.51.1](#0511) @@ -23,18 +25,18 @@ - [0.51.0](#0510) - [Fixed](#fixed-4) - [Changed](#changed-4) - - [Added](#added-3) -- [0.50.0](#0500) - [Added](#added-4) -- [0.49.3](#0493) +- [0.50.0](#0500) - [Added](#added-5) +- [0.49.3](#0493) + - [Added](#added-6) - [0.49.2](#0492) - [Changed](#changed-5) - [0.49.1](#0491) - [Fixed](#fixed-5) - [Changed](#changed-6) - [0.49.0](#0490) - - [Added](#added-6) + - [Added](#added-7) - [Fixed](#fixed-6) - [Changed](#changed-7) - [0.48.1](#0481) @@ -53,14 +55,14 @@ - [Changed](#changed-11) - [Fixed](#fixed-11) - [0.33.1 .. 0.46.0](#0331--0460) - - [Added](#added-7) + - [Added](#added-8) - [Removed](#removed-1) - [Changed](#changed-12) - [Fixed](#fixed-12) - [0.33.1](#0331) - [Fixed](#fixed-13) - [0.33.0](#0330) - - [Added](#added-8) + - [Added](#added-9) - [Changed](#changed-13) - [Deprecated](#deprecated-1) - [Removed](#removed-2) @@ -71,22 +73,22 @@ - [0.32.1](#0321) - [Fixed](#fixed-16) - [0.32.0](#0320) - - [Added](#added-9) + - [Added](#added-10) - [Changed](#changed-14) - [Fixed](#fixed-17) - [0.31.0](#0310) - - [Added](#added-10) + - [Added](#added-11) - [Changed](#changed-15) - [Deprecated](#deprecated-2) - [Removed](#removed-3) - [Fixed](#fixed-18) - [0.30.0](#0300) - - [Added](#added-11) + - [Added](#added-12) - [Changed](#changed-16) - [Deprecated](#deprecated-3) - [Fixed](#fixed-19) - [0.29.0](#0290) - - [Added](#added-12) + - [Added](#added-13) - [Changed](#changed-17) - [Fixed](#fixed-20) @@ -124,6 +126,16 @@ Released YYYY/MM/DD -------------------------------------------------------------------------------- +# 0.53.1 + +Released 2020/02/03. + +## Added + + * Opt-in to convert size_t to usize again (#1720). + +-------------------------------------------------------------------------------- + # 0.53.0 Released 2020/02/02. diff --git a/Cargo.lock b/Cargo.lock index 6c6203d920..2898ae21de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,7 +27,7 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.53.0" +version = "0.53.1" dependencies = [ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 00394b9fdb..5bdb3e8826 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" repository = "https://github.com/rust-lang/rust-bindgen" documentation = "https://docs.rs/bindgen" homepage = "https://rust-lang.github.io/rust-bindgen/" -version = "0.53.0" +version = "0.53.1" build = "build.rs" include = [ diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index ab62b13577..9a3b10d70b 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -4126,8 +4126,14 @@ mod utils { "int64_t" => primitive_ty(ctx, "i64"), "uint64_t" => primitive_ty(ctx, "u64"), + "size_t" if ctx.options().size_t_is_usize => { + primitive_ty(ctx, "usize") + } "uintptr_t" => primitive_ty(ctx, "usize"), + "ssize_t" if ctx.options().size_t_is_usize => { + primitive_ty(ctx, "isize") + } "intptr_t" | "ptrdiff_t" => primitive_ty(ctx, "isize"), _ => return None, }) diff --git a/src/lib.rs b/src/lib.rs index 97fbdf01e9..4a8b8d8a7a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -604,6 +604,10 @@ impl Builder { output_vector.push("--no-record-matches".into()); } + if self.options.size_t_is_usize { + output_vector.push("--size_t-is-usize".into()); + } + if !self.options.rustfmt_bindings { output_vector.push("--no-rustfmt-bindings".into()); } @@ -1350,6 +1354,12 @@ impl Builder { self } + /// Set whether `size_t` should be translated to `usize` automatically. + pub fn size_t_is_usize(mut self, is: bool) -> Self { + self.options.size_t_is_usize = is; + self + } + /// Set whether rustfmt should format the generated bindings. pub fn rustfmt_bindings(mut self, doit: bool) -> Self { self.options.rustfmt_bindings = doit; @@ -1776,6 +1786,9 @@ struct BindgenOptions { /// items via the `error!` log. record_matches: bool, + /// Whether `size_t` should be translated to `usize` automatically. + size_t_is_usize: bool, + /// Whether rustfmt should format the generated bindings. rustfmt_bindings: bool, @@ -1917,6 +1930,7 @@ impl Default for BindgenOptions { time_phases: false, record_matches: true, rustfmt_bindings: true, + size_t_is_usize: false, rustfmt_configuration_file: None, no_partialeq_types: Default::default(), no_copy_types: Default::default(), diff --git a/src/options.rs b/src/options.rs index 01982f13cf..b630bb4bed 100644 --- a/src/options.rs +++ b/src/options.rs @@ -383,6 +383,9 @@ where "Do not record matching items in the regex sets. \ This disables reporting of unused items.", ), + Arg::with_name("size_t-is-usize") + .long("size_t-is-usize") + .help("Translate size_t to usize."), Arg::with_name("no-rustfmt-bindings") .long("no-rustfmt-bindings") .help("Do not format the generated bindings with rustfmt."), @@ -763,6 +766,10 @@ where builder = builder.record_matches(false); } + if matches.is_present("size_t-is-usize") { + builder = builder.size_t_is_usize(true); + } + let no_rustfmt_bindings = matches.is_present("no-rustfmt-bindings"); if no_rustfmt_bindings { builder = builder.rustfmt_bindings(false); diff --git a/tests/expectations/tests/size_t_is_usize.rs b/tests/expectations/tests/size_t_is_usize.rs new file mode 100644 index 0000000000..c8cd9e054f --- /dev/null +++ b/tests/expectations/tests/size_t_is_usize.rs @@ -0,0 +1,49 @@ +/* automatically generated by rust-bindgen */ + +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct A { + pub len: usize, + pub offset: isize, + pub next: *mut A, +} +#[test] +fn bindgen_test_layout_A() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(A)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(A)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).len as *const _ as usize }, + 0usize, + concat!("Offset of field: ", stringify!(A), "::", stringify!(len)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).offset as *const _ as usize }, + 8usize, + concat!("Offset of field: ", stringify!(A), "::", stringify!(offset)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).next as *const _ as usize }, + 16usize, + concat!("Offset of field: ", stringify!(A), "::", stringify!(next)) + ); +} +impl Default for A { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} diff --git a/tests/headers/size_t_is_usize.h b/tests/headers/size_t_is_usize.h new file mode 100644 index 0000000000..564b486784 --- /dev/null +++ b/tests/headers/size_t_is_usize.h @@ -0,0 +1,10 @@ +// bindgen-flags: --size_t-is-usize + +typedef unsigned long size_t; +typedef long ssize_t; + +struct A { + size_t len; + ssize_t offset; + struct A* next; +};