37 lines
724 B
Rust
37 lines
724 B
Rust
// 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);
|
|
}
|