Skip to content

Commit

Permalink
Auto merge of #1094 - photoszzt:fix_hash_incomplete_arr, r=emilio
Browse files Browse the repository at this point in the history
Fix mistakenly derive hash for struct that contains IncompleteArrayField

Fix #1093

r? @fitzgen  or @emilio
  • Loading branch information
bors-servo authored Oct 24, 2017
2 parents 17adb13 + fa9b5e3 commit dc1e546
Show file tree
Hide file tree
Showing 7 changed files with 351 additions and 4 deletions.
5 changes: 4 additions & 1 deletion src/ir/analysis/derive_hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,10 @@ impl<'ctx> MonotoneFramework for CannotDeriveHash<'ctx> {
return self.insert(id);
}

if len <= RUST_DERIVE_IN_ARRAY_LIMIT {
if len == 0 {
trace!(" cannot derive `Hash` for incomplete arrays");
self.insert(id)
} else if len <= RUST_DERIVE_IN_ARRAY_LIMIT {
trace!(" array is small enough to derive Hash");
ConstrainResult::Same
} else {
Expand Down
90 changes: 88 additions & 2 deletions tests/expectations/tests/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,47 @@ impl Default for C_with_zero_length_array {
}
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct C_with_zero_length_array_2 {
pub a: ::std::os::raw::c_int,
pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_C_with_zero_length_array_2() {
assert_eq!(
::std::mem::size_of::<C_with_zero_length_array_2>(),
4usize,
concat!("Size of: ", stringify!(C_with_zero_length_array_2))
);
assert_eq!(
::std::mem::align_of::<C_with_zero_length_array_2>(),
4usize,
concat!("Alignment of ", stringify!(C_with_zero_length_array_2))
);
assert_eq!(
unsafe { &(*(0 as *const C_with_zero_length_array_2)).a as *const _ as usize },
0usize,
concat!(
"Alignment of field: ",
stringify!(C_with_zero_length_array_2),
"::",
stringify!(a)
)
);
assert_eq!(
unsafe {
&(*(0 as *const C_with_zero_length_array_2)).zero_length_array as *const _ as usize
},
4usize,
concat!(
"Alignment of field: ",
stringify!(C_with_zero_length_array_2),
"::",
stringify!(zero_length_array)
)
);
}
#[repr(C)]
pub struct C_with_incomplete_array {
pub a: ::std::os::raw::c_int,
pub big_array: [::std::os::raw::c_char; 33usize],
Expand All @@ -166,6 +207,25 @@ impl Default for C_with_incomplete_array {
}
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct C_with_incomplete_array_2 {
pub a: ::std::os::raw::c_int,
pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_C_with_incomplete_array_2() {
assert_eq!(
::std::mem::size_of::<C_with_incomplete_array_2>(),
4usize,
concat!("Size of: ", stringify!(C_with_incomplete_array_2))
);
assert_eq!(
::std::mem::align_of::<C_with_incomplete_array_2>(),
4usize,
concat!("Alignment of ", stringify!(C_with_incomplete_array_2))
);
}
#[repr(C)]
pub struct C_with_zero_length_array_and_incomplete_array {
pub a: ::std::os::raw::c_int,
pub big_array: [::std::os::raw::c_char; 33usize],
Expand Down Expand Up @@ -197,7 +257,33 @@ impl Default for C_with_zero_length_array_and_incomplete_array {
}
}
#[repr(C)]
#[derive(Debug, Default, Hash, PartialEq, Eq)]
#[derive(Debug, Default)]
pub struct C_with_zero_length_array_and_incomplete_array_2 {
pub a: ::std::os::raw::c_int,
pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>,
pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array_2() {
assert_eq!(
::std::mem::size_of::<C_with_zero_length_array_and_incomplete_array_2>(),
4usize,
concat!(
"Size of: ",
stringify!(C_with_zero_length_array_and_incomplete_array_2)
)
);
assert_eq!(
::std::mem::align_of::<C_with_zero_length_array_and_incomplete_array_2>(),
4usize,
concat!(
"Alignment of ",
stringify!(C_with_zero_length_array_and_incomplete_array_2)
)
);
}
#[repr(C)]
#[derive(Debug, Default, Hash, PartialOrd, Ord, PartialEq, Eq)]
pub struct WithDtor {
pub b: ::std::os::raw::c_int,
}
Expand Down Expand Up @@ -336,7 +422,7 @@ impl Default for WithUnion {
}
}
#[repr(C)]
#[derive(Debug, Default, Copy, Hash, PartialEq, Eq)]
#[derive(Debug, Default, Copy, Hash, PartialOrd, Ord, PartialEq, Eq)]
pub struct RealAbstractionWithTonsOfMethods {
pub _address: u8,
}
Expand Down
86 changes: 86 additions & 0 deletions tests/expectations/tests/class_1_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,47 @@ impl Default for C_with_zero_length_array {
}
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct C_with_zero_length_array_2 {
pub a: ::std::os::raw::c_int,
pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_C_with_zero_length_array_2() {
assert_eq!(
::std::mem::size_of::<C_with_zero_length_array_2>(),
4usize,
concat!("Size of: ", stringify!(C_with_zero_length_array_2))
);
assert_eq!(
::std::mem::align_of::<C_with_zero_length_array_2>(),
4usize,
concat!("Alignment of ", stringify!(C_with_zero_length_array_2))
);
assert_eq!(
unsafe { &(*(0 as *const C_with_zero_length_array_2)).a as *const _ as usize },
0usize,
concat!(
"Alignment of field: ",
stringify!(C_with_zero_length_array_2),
"::",
stringify!(a)
)
);
assert_eq!(
unsafe {
&(*(0 as *const C_with_zero_length_array_2)).zero_length_array as *const _ as usize
},
4usize,
concat!(
"Alignment of field: ",
stringify!(C_with_zero_length_array_2),
"::",
stringify!(zero_length_array)
)
);
}
#[repr(C)]
pub struct C_with_incomplete_array {
pub a: ::std::os::raw::c_int,
pub big_array: [::std::os::raw::c_char; 33usize],
Expand All @@ -214,6 +255,25 @@ impl Default for C_with_incomplete_array {
}
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct C_with_incomplete_array_2 {
pub a: ::std::os::raw::c_int,
pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_C_with_incomplete_array_2() {
assert_eq!(
::std::mem::size_of::<C_with_incomplete_array_2>(),
4usize,
concat!("Size of: ", stringify!(C_with_incomplete_array_2))
);
assert_eq!(
::std::mem::align_of::<C_with_incomplete_array_2>(),
4usize,
concat!("Alignment of ", stringify!(C_with_incomplete_array_2))
);
}
#[repr(C)]
pub struct C_with_zero_length_array_and_incomplete_array {
pub a: ::std::os::raw::c_int,
pub big_array: [::std::os::raw::c_char; 33usize],
Expand Down Expand Up @@ -245,6 +305,32 @@ impl Default for C_with_zero_length_array_and_incomplete_array {
}
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct C_with_zero_length_array_and_incomplete_array_2 {
pub a: ::std::os::raw::c_int,
pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>,
pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array_2() {
assert_eq!(
::std::mem::size_of::<C_with_zero_length_array_and_incomplete_array_2>(),
4usize,
concat!(
"Size of: ",
stringify!(C_with_zero_length_array_and_incomplete_array_2)
)
);
assert_eq!(
::std::mem::align_of::<C_with_zero_length_array_and_incomplete_array_2>(),
4usize,
concat!(
"Alignment of ",
stringify!(C_with_zero_length_array_and_incomplete_array_2)
)
);
}
#[repr(C)]
#[derive(Debug, Default, Hash, PartialEq, Eq)]
pub struct WithDtor {
pub b: ::std::os::raw::c_int,
Expand Down
121 changes: 121 additions & 0 deletions tests/expectations/tests/derive-hash-struct-with-incomplete-array.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/* automatically generated by rust-bindgen */


#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]


#[repr(C)]
#[derive(Default)]
pub struct __IncompleteArrayField<T>(::std::marker::PhantomData<T>);
impl<T> __IncompleteArrayField<T> {
#[inline]
pub fn new() -> Self {
__IncompleteArrayField(::std::marker::PhantomData)
}
#[inline]
pub unsafe fn as_ptr(&self) -> *const T {
::std::mem::transmute(self)
}
#[inline]
pub unsafe fn as_mut_ptr(&mut self) -> *mut T {
::std::mem::transmute(self)
}
#[inline]
pub unsafe fn as_slice(&self, len: usize) -> &[T] {
::std::slice::from_raw_parts(self.as_ptr(), len)
}
#[inline]
pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
}
}
impl<T> ::std::fmt::Debug for __IncompleteArrayField<T> {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
fmt.write_str("__IncompleteArrayField")
}
}
impl<T> ::std::clone::Clone for __IncompleteArrayField<T> {
#[inline]
fn clone(&self) -> Self {
Self::new()
}
}
impl<T> ::std::marker::Copy for __IncompleteArrayField<T> {}
#[repr(C)]
#[derive(Debug, Default)]
pub struct test {
pub a: ::std::os::raw::c_int,
pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_test() {
assert_eq!(
::std::mem::size_of::<test>(),
4usize,
concat!("Size of: ", stringify!(test))
);
assert_eq!(
::std::mem::align_of::<test>(),
4usize,
concat!("Alignment of ", stringify!(test))
);
assert_eq!(
unsafe { &(*(0 as *const test)).a as *const _ as usize },
0usize,
concat!(
"Alignment of field: ",
stringify!(test),
"::",
stringify!(a)
)
);
assert_eq!(
unsafe { &(*(0 as *const test)).zero_length_array as *const _ as usize },
4usize,
concat!(
"Alignment of field: ",
stringify!(test),
"::",
stringify!(zero_length_array)
)
);
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct test2 {
pub a: ::std::os::raw::c_int,
pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_test2() {
assert_eq!(
::std::mem::size_of::<test2>(),
4usize,
concat!("Size of: ", stringify!(test2))
);
assert_eq!(
::std::mem::align_of::<test2>(),
4usize,
concat!("Alignment of ", stringify!(test2))
);
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct test3 {
pub a: ::std::os::raw::c_int,
pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>,
pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_test3() {
assert_eq!(
::std::mem::size_of::<test3>(),
4usize,
concat!("Size of: ", stringify!(test3))
);
assert_eq!(
::std::mem::align_of::<test3>(),
4usize,
concat!("Alignment of ", stringify!(test3))
);
}
Loading

0 comments on commit dc1e546

Please sign in to comment.