Variants::Single: do not use invalid VariantIdx for uninhabited enums
This commit is contained in:
@@ -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: FIRST_VARIANT },
|
||||
variants: Variants::Single { index: Some(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: FIRST_VARIANT },
|
||||
variants: Variants::Single { index: Some(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: FIRST_VARIANT },
|
||||
variants: Variants::Single { index: Some(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: FIRST_VARIANT },
|
||||
variants: Variants::Single { index: Some(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 };
|
||||
variant.variants = Variants::Single { index: Some(index) };
|
||||
|
||||
let FieldsShape::Arbitrary { offsets, memory_index } = variant.fields else {
|
||||
bug!();
|
||||
@@ -1105,7 +1105,9 @@ fn variant_info_for_adt<'tcx>(
|
||||
|
||||
match layout.variants {
|
||||
Variants::Single { index } => {
|
||||
if !adt_def.variants().is_empty() && layout.fields != FieldsShape::Primitive {
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user