File: dyn-trait.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (21 lines) | stat: -rw-r--r-- 997 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//@ run-pass
use std::ptr::addr_of;

// When the unsized tail is a `dyn Trait`, its alignments is only dynamically known. This means the
// packed(2) needs to be applied at runtime: the actual alignment of the field is `min(2,
// usual_alignment)`. Here we check that we do this right by comparing size, alignment, and field
// offset before and after unsizing.
fn main() {
    #[repr(C, packed(2))]
    struct Packed<T: ?Sized>(u8, core::mem::ManuallyDrop<T>);

    let p = Packed(0, core::mem::ManuallyDrop::new(1));
    let p: &Packed<usize> = &p;
    let sized = (core::mem::size_of_val(p), core::mem::align_of_val(p));
    let sized_offset = unsafe { addr_of!(p.1).cast::<u8>().offset_from(addr_of!(p.0)) };
    let p: &Packed<dyn Send> = p;
    let un_sized = (core::mem::size_of_val(p), core::mem::align_of_val(p));
    let un_sized_offset = unsafe { addr_of!(p.1).cast::<u8>().offset_from(addr_of!(p.0)) };
    assert_eq!(sized, un_sized);
    assert_eq!(sized_offset, un_sized_offset);
}