summaryrefslogtreecommitdiffstats
path: root/src/test/ui/issues/issue-99838.rs
blob: eaeeac72b25e17ee0a2611b518f92222c32cb10a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 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;
}