Auto merge of #118602 - TaKO8Ki:rollup-njcouns, r=TaKO8Ki
Rollup of 5 pull requests Successful merges: - #118495 (Restrict what symbols can be used in `#[diagnostic::on_unimplemented]` format strings) - #118540 (codegen, miri: fix computing the offset of an unsized field in a packed struct) - #118551 (more targeted errors when extern types end up in places they should not) - #118573 (rustc: Harmonize `DefKind` and `DefPathData`) - #118586 (Improve example in `slice::windows()` doc) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
e281163dc8
33 changed files with 854 additions and 209 deletions
|
|
@ -0,0 +1,35 @@
|
|||
#![feature(layout_for_ptr)]
|
||||
use std::mem;
|
||||
|
||||
#[repr(packed, C)]
|
||||
struct PackedSized {
|
||||
f: u8,
|
||||
d: [u32; 4],
|
||||
}
|
||||
|
||||
#[repr(packed, C)]
|
||||
struct PackedUnsized {
|
||||
f: u8,
|
||||
d: [u32],
|
||||
}
|
||||
|
||||
impl PackedSized {
|
||||
fn unsize(&self) -> &PackedUnsized {
|
||||
// We can't unsize via a generic type since then we get the error
|
||||
// that packed structs with unsized tail don't work if the tail
|
||||
// might need dropping.
|
||||
let len = 4usize;
|
||||
unsafe { mem::transmute((self, len)) }
|
||||
}
|
||||
}
|
||||
|
||||
fn main() { unsafe {
|
||||
let p = PackedSized { f: 0, d: [1, 2, 3, 4] };
|
||||
let p = p.unsize() as *const PackedUnsized;
|
||||
// Make sure the size computation does *not* think there is
|
||||
// any padding in front of the `d` field.
|
||||
assert_eq!(mem::size_of_val_raw(p), 1 + 4*4);
|
||||
// And likewise for the offset computation.
|
||||
let d = std::ptr::addr_of!((*p).d);
|
||||
assert_eq!(d.cast::<u32>().read_unaligned(), 1);
|
||||
} }
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
#![feature(layout_for_ptr)]
|
||||
use std::mem;
|
||||
|
||||
#[repr(packed(4))]
|
||||
struct Slice([u32]);
|
||||
|
||||
#[repr(packed(2), C)]
|
||||
struct PackedSized {
|
||||
f: u8,
|
||||
d: [u32; 4],
|
||||
}
|
||||
|
||||
#[repr(packed(2), C)]
|
||||
struct PackedUnsized {
|
||||
f: u8,
|
||||
d: Slice,
|
||||
}
|
||||
|
||||
impl PackedSized {
|
||||
fn unsize(&self) -> &PackedUnsized {
|
||||
// We can't unsize via a generic type since then we get the error
|
||||
// that packed structs with unsized tail don't work if the tail
|
||||
// might need dropping.
|
||||
let len = 4usize;
|
||||
unsafe { mem::transmute((self, len)) }
|
||||
}
|
||||
}
|
||||
|
||||
fn main() { unsafe {
|
||||
let p = PackedSized { f: 0, d: [1, 2, 3, 4] };
|
||||
let p = p.unsize() as *const PackedUnsized;
|
||||
// Make sure the size computation correctly adds exact 1 byte of padding
|
||||
// in front of the `d` field.
|
||||
assert_eq!(mem::size_of_val_raw(p), 1 + 1 + 4*4);
|
||||
// And likewise for the offset computation.
|
||||
let d = std::ptr::addr_of!((*p).d);
|
||||
assert_eq!(d.cast::<u32>().read_unaligned(), 1);
|
||||
} }
|
||||
Loading…
Add table
Add a link
Reference in a new issue