summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlier Lu <flier.lu@gmail.com>2017-02-08 22:08:38 +0800
committerFlier Lu <flier.lu@gmail.com>2017-02-08 23:04:44 +0800
commite08072a1c9343c9c513e059a8a31ee2d1af129a9 (patch)
treed6a30e66d8ed288ed82b422f0132da5fe850d59a
parent8264afa875d686688680123859f8820e19c8028c (diff)
check layout align before padding bytes
-rw-r--r--src/codegen/struct_layout.rs5
-rw-r--r--tests/expectations/tests/issue-493.rs152
-rw-r--r--tests/headers/issue-493.hpp47
3 files changed, 203 insertions, 1 deletions
diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs
index 98640570..f8a88bc2 100644
--- a/src/codegen/struct_layout.rs
+++ b/src/codegen/struct_layout.rs
@@ -89,9 +89,12 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> {
Some(offset) if offset / 8 > self.latest_offset => {
(offset / 8 - self.latest_offset, true)
}
- _ => {
+ _ if field_layout.align != 0 => {
(self.padding_bytes(field_layout), (self.latest_offset % field_layout.align) != 0)
}
+ _ => {
+ (0, false)
+ }
};
self.latest_offset += padding_bytes;
diff --git a/tests/expectations/tests/issue-493.rs b/tests/expectations/tests/issue-493.rs
new file mode 100644
index 00000000..f8814bd3
--- /dev/null
+++ b/tests/expectations/tests/issue-493.rs
@@ -0,0 +1,152 @@
+/* automatically generated by rust-bindgen */
+
+
+#![allow(non_snake_case)]
+
+
+#[repr(C)]
+pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>);
+impl <T> __BindgenUnionField<T> {
+ #[inline]
+ pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) }
+ #[inline]
+ pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) }
+ #[inline]
+ pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) }
+}
+impl <T> ::std::default::Default for __BindgenUnionField<T> {
+ #[inline]
+ fn default() -> Self { Self::new() }
+}
+impl <T> ::std::clone::Clone for __BindgenUnionField<T> {
+ #[inline]
+ fn clone(&self) -> Self { Self::new() }
+}
+impl <T> ::std::marker::Copy for __BindgenUnionField<T> { }
+impl <T> ::std::fmt::Debug for __BindgenUnionField<T> {
+ fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+ fmt.write_str("__BindgenUnionField")
+ }
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct basic_string<_CharT, _Traits, _Allocator> {
+ pub _address: u8,
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+pub type basic_string_size_type = ::std::os::raw::c_ulonglong;
+pub type basic_string_value_type = ::std::os::raw::c_char;
+pub type basic_string_pointer = *mut basic_string_value_type;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct basic_string___long<_CharT, _Traits, _Allocator> {
+ pub __cap_: basic_string_size_type,
+ pub __size_: basic_string_size_type,
+ pub __data_: basic_string_pointer,
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string___long<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+pub const basic_string___min_cap: basic_string__bindgen_ty_1 =
+ basic_string__bindgen_ty_1::__min_cap;
+#[repr(i32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum basic_string__bindgen_ty_1 { __min_cap = 0, }
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct basic_string___short<_CharT, _Traits, _Allocator> {
+ pub __bindgen_anon_1: basic_string___short__bindgen_ty_1<_CharT, _Traits,
+ _Allocator>,
+ pub __data_: *mut basic_string_value_type,
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+#[repr(C)]
+#[derive(Debug, Default, Copy, Clone)]
+pub struct basic_string___short__bindgen_ty_1<_CharT, _Traits, _Allocator> {
+ pub __size_: __BindgenUnionField<::std::os::raw::c_uchar>,
+ pub __lx: __BindgenUnionField<basic_string_value_type>,
+ pub bindgen_union_field: u8,
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string___short<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct basic_string___ulx<_CharT, _Traits, _Allocator> {
+ pub __lx: __BindgenUnionField<basic_string___long<_CharT, _Traits,
+ _Allocator>>,
+ pub __lxx: __BindgenUnionField<basic_string___short<_CharT, _Traits,
+ _Allocator>>,
+ pub bindgen_union_field: [u8; 0usize],
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string___ulx<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+pub const basic_string___n_words: basic_string__bindgen_ty_2 =
+ basic_string__bindgen_ty_2::__n_words;
+#[repr(i32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum basic_string__bindgen_ty_2 { __n_words = 0, }
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct basic_string___raw<_CharT, _Traits, _Allocator> {
+ pub __words: *mut basic_string_size_type,
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string___raw<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct basic_string___rep<_CharT, _Traits, _Allocator> {
+ pub __bindgen_anon_1: basic_string___rep__bindgen_ty_1<_CharT, _Traits,
+ _Allocator>,
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct basic_string___rep__bindgen_ty_1<_CharT, _Traits, _Allocator> {
+ pub __l: __BindgenUnionField<basic_string___long<_CharT, _Traits,
+ _Allocator>>,
+ pub __s: __BindgenUnionField<basic_string___short<_CharT, _Traits,
+ _Allocator>>,
+ pub __r: __BindgenUnionField<basic_string___raw<_CharT, _Traits,
+ _Allocator>>,
+ pub bindgen_union_field: [u8; 0usize],
+ pub _phantom_0: ::std::marker::PhantomData<_CharT>,
+ pub _phantom_1: ::std::marker::PhantomData<_Traits>,
+ pub _phantom_2: ::std::marker::PhantomData<_Allocator>,
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string___rep__bindgen_ty_1<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string___rep<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+impl <_CharT, _Traits, _Allocator> Default for
+ basic_string<_CharT, _Traits, _Allocator> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
diff --git a/tests/headers/issue-493.hpp b/tests/headers/issue-493.hpp
new file mode 100644
index 00000000..975ef5ce
--- /dev/null
+++ b/tests/headers/issue-493.hpp
@@ -0,0 +1,47 @@
+template<class _CharT, class _Traits, class _Allocator>
+class basic_string
+{
+public:
+ typedef unsigned long long size_type;
+ typedef char value_type;
+ typedef value_type * pointer;
+
+ struct __long
+ {
+ size_type __cap_;
+ size_type __size_;
+ pointer __data_;
+ };
+
+ enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
+ (sizeof(__long) - 1)/sizeof(value_type) : 2};
+
+ struct __short
+ {
+ union
+ {
+ unsigned char __size_;
+ value_type __lx;
+ };
+ value_type __data_[__min_cap];
+ };
+
+ union __ulx{__long __lx; __short __lxx;};
+
+ enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
+
+ struct __raw
+ {
+ size_type __words[__n_words];
+ };
+
+ struct __rep
+ {
+ union
+ {
+ __long __l;
+ __short __s;
+ __raw __r;
+ };
+ };
+}; \ No newline at end of file