41 lines
792 B
Rust
41 lines
792 B
Rust
|
// run-pass
|
||
|
#![feature(bench_black_box)]
|
||
|
use std::hint;
|
||
|
|
||
|
struct U16(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(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;
|
||
|
}
|