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