disable some layout optimizations for unsizable structs

This commit is contained in:
The 8472 2023-05-29 20:07:06 +02:00
parent 381b778d27
commit 3003d05a8b

View File

@ -57,6 +57,10 @@ fn univariant(
// run and bias niches to the right and then check which one is closer to one of the struct's // run and bias niches to the right and then check which one is closer to one of the struct's
// edges. // edges.
if let Some(layout) = &layout { if let Some(layout) = &layout {
// Don't try to calculate an end-biased layout for unsizable structs,
// otherwise we could end up with different layouts for
// Foo<Type> and Foo<dyn Trait> which would break unsizing
if !matches!(kind, StructKind::MaybeUnsized) {
if let Some(niche) = layout.largest_niche { if let Some(niche) = layout.largest_niche {
let head_space = niche.offset.bytes(); let head_space = niche.offset.bytes();
let niche_length = niche.value.size(dl).bytes(); let niche_length = niche.value.size(dl).bytes();
@ -73,7 +77,8 @@ fn univariant(
.expect("alt layout should have a niche like the regular one"); .expect("alt layout should have a niche like the regular one");
let alt_head_space = niche.offset.bytes(); let alt_head_space = niche.offset.bytes();
let alt_niche_len = niche.value.size(dl).bytes(); let alt_niche_len = niche.value.size(dl).bytes();
let alt_tail_space = alt_layout.size.bytes() - alt_head_space - alt_niche_len; let alt_tail_space =
alt_layout.size.bytes() - alt_head_space - alt_niche_len;
debug_assert_eq!(layout.size.bytes(), alt_layout.size.bytes()); debug_assert_eq!(layout.size.bytes(), alt_layout.size.bytes());
@ -103,6 +108,7 @@ fn univariant(
} }
} }
} }
}
layout layout
} }