still accept references to u8 slices and str in packed fields
This commit is contained in:
@@ -21,12 +21,18 @@ where
|
||||
};
|
||||
|
||||
let ty = place.ty(local_decls, tcx).ty;
|
||||
let unsized_tail = || tcx.struct_tail_with_normalize(ty, |ty| ty, || {});
|
||||
match tcx.layout_of(param_env.and(ty)) {
|
||||
Ok(layout) if layout.align.abi <= pack && layout.is_sized() => {
|
||||
Ok(layout)
|
||||
if layout.align.abi <= pack
|
||||
&& (layout.is_sized()
|
||||
|| matches!(unsized_tail().kind(), ty::Slice(..) | ty::Str)) =>
|
||||
{
|
||||
// If the packed alignment is greater or equal to the field alignment, the type won't be
|
||||
// further disaligned.
|
||||
// However we need to ensure the field is sized; for unsized fields, `layout.align` is
|
||||
// just an approximation.
|
||||
// just an approximation -- except when the unsized tail is a slice, where the alignment
|
||||
// is fully determined by the type.
|
||||
debug!(
|
||||
"is_disaligned({:?}) - align = {}, packed = {}; not disaligned",
|
||||
place,
|
||||
|
||||
Reference in New Issue
Block a user