| //@ run-pass |
| // 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)] |
| #[derive(Copy, Clone, PartialEq)] |
| 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); |
| } |