rust/tests/ui/issues/issue-99838.rs
2024-02-16 20:02:50 +00:00

40 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;
}