2017-10-02 08:15:23 -05:00
|
|
|
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
}
|