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;
+};