2018-08-30 07:18:55 -05:00
|
|
|
//@ run-pass
|
2017-10-02 08:15:23 -05:00
|
|
|
// check that derive on a packed struct does not call field
|
|
|
|
// methods with a misaligned field.
|
|
|
|
|
|
|
|
use std::mem;
|
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
struct Aligned(usize);
|
|
|
|
|
|
|
|
#[inline(never)]
|
|
|
|
fn check_align(ptr: *const Aligned) {
|
|
|
|
assert_eq!(ptr as usize % mem::align_of::<Aligned>(),
|
|
|
|
0);
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PartialEq for Aligned {
|
|
|
|
fn eq(&self, other: &Self) -> bool {
|
|
|
|
check_align(self);
|
|
|
|
check_align(other);
|
|
|
|
self.0 == other.0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(packed)]
|
2017-11-19 09:04:24 -06:00
|
|
|
#[derive(Copy, Clone, PartialEq)]
|
2017-10-02 08:15:23 -05:00
|
|
|
struct Packed(Aligned, Aligned);
|
|
|
|
|
|
|
|
#[derive(PartialEq)]
|
|
|
|
#[repr(C)]
|
|
|
|
struct Dealigned<T>(u8, T);
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let d1 = Dealigned(0, Packed(Aligned(1), Aligned(2)));
|
|
|
|
let ck = d1 == d1;
|
|
|
|
assert!(ck);
|
|
|
|
}
|