41 lines
805 B
Rust
41 lines
805 B
Rust
//@ run-pass
|
|
|
|
use std::hint;
|
|
|
|
struct U16(#[allow(dead_code)] u16);
|
|
|
|
impl Drop for U16 {
|
|
fn drop(&mut self) {
|
|
// Prevent LLVM from optimizing away our alignment check.
|
|
assert!(hint::black_box(self as *mut U16 as usize) % 2 == 0);
|
|
}
|
|
}
|
|
|
|
struct HasDrop;
|
|
|
|
impl Drop for HasDrop {
|
|
fn drop(&mut self) {}
|
|
}
|
|
|
|
struct Wrapper {
|
|
_a: U16,
|
|
b: HasDrop,
|
|
}
|
|
|
|
#[repr(packed)]
|
|
struct Misalign(#[allow(dead_code)] u8, Wrapper);
|
|
|
|
fn main() {
|
|
let m = Misalign(
|
|
0,
|
|
Wrapper {
|
|
_a: U16(10),
|
|
b: HasDrop,
|
|
},
|
|
);
|
|
// Put it somewhere definitely even (so the `a` field is definitely at an odd address).
|
|
let m: ([u16; 0], Misalign) = ([], m);
|
|
// Move out one field, so we run custom per-field drop logic below.
|
|
let _x = m.1.1.b;
|
|
}
|