summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2018-05-14 18:42:25 +0200
committerEmilio Cobos Álvarez <emilio@crisal.io>2018-05-16 01:30:24 +0200
commit716d53b02d363880184c05e80f8bf4982ee1ed23 (patch)
tree10ab032849549f0e74e39caa5ac4551515317e70
parent35fb11392449fd34db36b05c24b2f3e746120705 (diff)
Handle pointer constness at the right level.
-rw-r--r--src/codegen/mod.rs2
-rw-r--r--src/ir/ty.rs17
-rw-r--r--tests/expectations/tests/const-const-mut-ptr.rs32
-rw-r--r--tests/headers/const-const-mut-ptr.h3
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;
+};