diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-05-14 18:42:25 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-05-16 01:30:24 +0200 |
commit | 716d53b02d363880184c05e80f8bf4982ee1ed23 (patch) | |
tree | 10ab032849549f0e74e39caa5ac4551515317e70 | |
parent | 35fb11392449fd34db36b05c24b2f3e746120705 (diff) |
Handle pointer constness at the right level.
-rw-r--r-- | src/codegen/mod.rs | 2 | ||||
-rw-r--r-- | src/ir/ty.rs | 17 | ||||
-rw-r--r-- | tests/expectations/tests/const-const-mut-ptr.rs | 32 | ||||
-rw-r--r-- | tests/headers/const-const-mut-ptr.h | 3 |
4 files changed, 37 insertions, 17 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index fd48ff2b..b6aabb17 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -3054,7 +3054,7 @@ impl TryToRustTy for Type { } TypeKind::Pointer(inner) | TypeKind::Reference(inner) => { - let is_const = self.is_const() || ctx.resolve_type(inner).is_const(); + let is_const = ctx.resolve_type(inner).is_const(); let inner = inner.into_resolver().through_type_refs().resolve(ctx); let inner_ty = inner.expect_type(); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index b742dcc1..b805dd62 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1195,22 +1195,7 @@ impl Type { let name = if name.is_empty() { None } else { Some(name) }; - // Just using ty.is_const() is wrong here, because when we declare an - // argument like 'int* const arg0', arg0 is considered - // const but the pointer itself points to mutable data. - // - // Without canonicalizing the type to the pointer type, we'll get the - // following mapping: - // - // arg0: *const c_int - // - // So by canonicalizing the type first, we can check constness by - // calling is_const() on the pointer type. - let is_const = if let Some(pty) = ty.pointee_type() { - pty.is_const() - } else { - ty.is_const() - }; + let is_const = ty.is_const(); let ty = Type::new(name, layout, kind, is_const); // TODO: maybe declaration.canonical()? diff --git a/tests/expectations/tests/const-const-mut-ptr.rs b/tests/expectations/tests/const-const-mut-ptr.rs new file mode 100644 index 00000000..ecfbf58f --- /dev/null +++ b/tests/expectations/tests/const-const-mut-ptr.rs @@ -0,0 +1,32 @@ +/* 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 foo { + pub bar: *const *const *mut *const ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_foo() { + assert_eq!( + ::std::mem::size_of::<foo>(), + 8usize, + concat!("Size of: ", stringify!(foo)) + ); + assert_eq!( + ::std::mem::align_of::<foo>(), + 8usize, + concat!("Alignment of ", stringify!(foo)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::<foo>())).bar as *const _ as usize }, + 0usize, + concat!("Offset of field: ", stringify!(foo), "::", stringify!(bar)) + ); +} +impl Default for foo { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} diff --git a/tests/headers/const-const-mut-ptr.h b/tests/headers/const-const-mut-ptr.h new file mode 100644 index 00000000..cc7daf7c --- /dev/null +++ b/tests/headers/const-const-mut-ptr.h @@ -0,0 +1,3 @@ +struct foo { + const int** const* const* bar; +}; |