Auto merge of #100064 - RalfJung:disaligned, r=petrochenkov
fix is_disaligned logic for nested packed structs https://github.com/rust-lang/rust/pull/83605 broke the `is_disaligned` logic by bailing out of the loop in `is_within_packed` early. This PR fixes that problem and adds suitable tests. Fixes https://github.com/rust-lang/rust/issues/99838
This commit is contained in:
commit
d6b96b61e7
4 changed files with 162 additions and 17 deletions
|
@ -48,20 +48,16 @@ fn is_within_packed<'tcx, L>(
|
|||
where
|
||||
L: HasLocalDecls<'tcx>,
|
||||
{
|
||||
for (place_base, elem) in place.iter_projections().rev() {
|
||||
match elem {
|
||||
// encountered a Deref, which is ABI-aligned
|
||||
ProjectionElem::Deref => break,
|
||||
ProjectionElem::Field(..) => {
|
||||
let ty = place_base.ty(local_decls, tcx).ty;
|
||||
match ty.kind() {
|
||||
ty::Adt(def, _) => return def.repr().pack,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
place
|
||||
.iter_projections()
|
||||
.rev()
|
||||
// Stop at `Deref`; standard ABI alignment applies there.
|
||||
.take_while(|(_base, elem)| !matches!(elem, ProjectionElem::Deref))
|
||||
// Consider the packed alignments at play here...
|
||||
.filter_map(|(base, _elem)| {
|
||||
base.ty(local_decls, tcx).ty.ty_adt_def().and_then(|adt| adt.repr().pack)
|
||||
})
|
||||
// ... and compute their minimum.
|
||||
// The overall smallest alignment is what matters.
|
||||
.min()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue