// run-pass

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