1
Fork 0

make no-variant types a dedicated Variants variant

This commit is contained in:
Ralf Jung 2024-12-01 17:33:01 +01:00
parent 21de42bf8d
commit e023590de4
53 changed files with 246 additions and 495 deletions

View file

@ -339,7 +339,7 @@ fn layout_of_uncached<'tcx>(
let largest_niche = if count != 0 { element.largest_niche } else { None };
tcx.mk_layout(LayoutData {
variants: Variants::Single { index: Some(FIRST_VARIANT) },
variants: Variants::Single { index: FIRST_VARIANT },
fields: FieldsShape::Array { stride: element.size, count },
backend_repr: abi,
largest_niche,
@ -352,7 +352,7 @@ fn layout_of_uncached<'tcx>(
ty::Slice(element) => {
let element = cx.layout_of(element)?;
tcx.mk_layout(LayoutData {
variants: Variants::Single { index: Some(FIRST_VARIANT) },
variants: Variants::Single { index: FIRST_VARIANT },
fields: FieldsShape::Array { stride: element.size, count: 0 },
backend_repr: BackendRepr::Memory { sized: false },
largest_niche: None,
@ -363,7 +363,7 @@ fn layout_of_uncached<'tcx>(
})
}
ty::Str => tcx.mk_layout(LayoutData {
variants: Variants::Single { index: Some(FIRST_VARIANT) },
variants: Variants::Single { index: FIRST_VARIANT },
fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
backend_repr: BackendRepr::Memory { sized: false },
largest_niche: None,
@ -534,7 +534,7 @@ fn layout_of_uncached<'tcx>(
};
tcx.mk_layout(LayoutData {
variants: Variants::Single { index: Some(FIRST_VARIANT) },
variants: Variants::Single { index: FIRST_VARIANT },
fields,
backend_repr: abi,
largest_niche: e_ly.largest_niche,
@ -926,7 +926,7 @@ fn coroutine_layout<'tcx>(
&ReprOptions::default(),
StructKind::Prefixed(prefix_size, prefix_align.abi),
)?;
variant.variants = Variants::Single { index: Some(index) };
variant.variants = Variants::Single { index };
let FieldsShape::Arbitrary { offsets, memory_index } = variant.fields else {
bug!();
@ -1104,17 +1104,13 @@ fn variant_info_for_adt<'tcx>(
};
match layout.variants {
Variants::Empty => (vec![], None),
Variants::Single { index } => {
if let Some(index) = index
&& layout.fields != FieldsShape::Primitive
{
debug!("print-type-size `{:#?}` variant {}", layout, adt_def.variant(index).name);
let variant_def = &adt_def.variant(index);
let fields: Vec<_> = variant_def.fields.iter().map(|f| f.name).collect();
(vec![build_variant_info(Some(variant_def.name), &fields, layout)], None)
} else {
(vec![], None)
}
debug!("print-type-size `{:#?}` variant {}", layout, adt_def.variant(index).name);
let variant_def = &adt_def.variant(index);
let fields: Vec<_> = variant_def.fields.iter().map(|f| f.name).collect();
(vec![build_variant_info(Some(variant_def.name), &fields, layout)], None)
}
Variants::Multiple { tag, ref tag_encoding, .. } => {

View file

@ -242,15 +242,15 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou
check_layout_abi(cx, layout);
match &layout.variants {
Variants::Single { index: None } => {
Variants::Empty => {
assert!(layout.is_uninhabited());
}
Variants::Single { index: Some(idx) } => {
Variants::Single { index } => {
if let Some(variants) = layout.ty.variant_range(tcx) {
assert!(variants.contains(idx));
assert!(variants.contains(index));
} else {
// Types without variants use `0` as dummy variant index.
assert!(idx.as_u32() == 0);
assert!(index.as_u32() == 0);
}
}
Variants::Multiple { variants, tag, tag_encoding, .. } => {