about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-12-01 17:33:01 +0100
committerRalf Jung <post@ralfj.de>2024-12-18 11:01:54 +0100
commite023590de407f417e0f3da675a372eca7acf60c6 (patch)
tree1250b36437667439bc369777a202d9571cec2f19
parent21de42bf8ddd0f39c766c7705990152302ae1f3b (diff)
downloadrust-e023590de407f417e0f3da675a372eca7acf60c6.tar.gz
rust-e023590de407f417e0f3da675a372eca7acf60c6.zip
make no-variant types a dedicated Variants variant
-rw-r--r--compiler/rustc_abi/src/callconv.rs2
-rw-r--r--compiler/rustc_abi/src/layout.rs19
-rw-r--r--compiler/rustc_abi/src/lib.rs10
-rw-r--r--compiler/rustc_codegen_cranelift/src/discriminant.rs7
-rw-r--r--compiler/rustc_codegen_gcc/src/type_of.rs6
-rw-r--r--compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs26
-rw-r--r--compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs2
-rw-r--r--compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs4
-rw-r--r--compiler/rustc_codegen_llvm/src/type_of.rs6
-rw-r--r--compiler/rustc_codegen_ssa/src/debuginfo/mod.rs4
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/place.rs8
-rw-r--r--compiler/rustc_const_eval/src/interpret/discriminant.rs8
-rw-r--r--compiler/rustc_const_eval/src/interpret/validity.rs9
-rw-r--r--compiler/rustc_const_eval/src/interpret/visitor.rs4
-rw-r--r--compiler/rustc_const_eval/src/util/check_validity_requirement.rs1
-rw-r--r--compiler/rustc_middle/src/ty/layout.rs24
-rw-r--r--compiler/rustc_mir_transform/src/large_enums.rs2
-rw-r--r--compiler/rustc_mir_transform/src/unreachable_enum_branching.rs4
-rw-r--r--compiler/rustc_smir/src/rustc_smir/convert/abi.rs7
-rw-r--r--compiler/rustc_target/src/callconv/loongarch.rs2
-rw-r--r--compiler/rustc_target/src/callconv/riscv.rs2
-rw-r--r--compiler/rustc_target/src/callconv/x86_64.rs2
-rw-r--r--compiler/rustc_transmute/src/layout/tree.rs15
-rw-r--r--compiler/rustc_ty_utils/src/layout.rs26
-rw-r--r--compiler/rustc_ty_utils/src/layout/invariant.rs8
-rw-r--r--compiler/stable_mir/src/abi.rs4
-rw-r--r--src/tools/miri/src/helpers.rs2
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/layout.rs8
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/mir/eval.rs8
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/utils.rs3
-rw-r--r--tests/ui/abi/c-zst.aarch64-darwin.stderr8
-rw-r--r--tests/ui/abi/c-zst.powerpc-linux.stderr8
-rw-r--r--tests/ui/abi/c-zst.s390x-linux.stderr8
-rw-r--r--tests/ui/abi/c-zst.sparc64-linux.stderr8
-rw-r--r--tests/ui/abi/c-zst.x86_64-linux.stderr8
-rw-r--r--tests/ui/abi/c-zst.x86_64-pc-windows-gnu.stderr8
-rw-r--r--tests/ui/abi/debug.stderr96
-rw-r--r--tests/ui/abi/sysv64-zst.stderr8
-rw-r--r--tests/ui/abi/win64-zst.x86_64-linux.stderr8
-rw-r--r--tests/ui/abi/win64-zst.x86_64-windows-gnu.stderr8
-rw-r--r--tests/ui/abi/win64-zst.x86_64-windows-msvc.stderr8
-rw-r--r--tests/ui/layout/debug.stderr64
-rw-r--r--tests/ui/layout/hexagon-enum.stderr20
-rw-r--r--tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr48
-rw-r--r--tests/ui/layout/issue-96185-overaligned-enum.stderr16
-rw-r--r--tests/ui/layout/thumb-enum.stderr20
-rw-r--r--tests/ui/layout/zero-sized-array-enum-niche.stderr36
-rw-r--r--tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr20
-rw-r--r--tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr20
-rw-r--r--tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr20
-rw-r--r--tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr20
-rw-r--r--tests/ui/repr/repr-c-int-dead-variants.stderr20
-rw-r--r--tests/ui/type/pattern_types/range_patterns.stderr28
53 files changed, 246 insertions, 495 deletions
diff --git a/compiler/rustc_abi/src/callconv.rs b/compiler/rustc_abi/src/callconv.rs
index ee63e46e88c..400395f99ff 100644
--- a/compiler/rustc_abi/src/callconv.rs
+++ b/compiler/rustc_abi/src/callconv.rs
@@ -206,7 +206,7 @@ impl<'a, Ty> TyAndLayout<'a, Ty> {
                 let (mut result, mut total) = from_fields_at(*self, Size::ZERO)?;
 
                 match &self.variants {
-                    abi::Variants::Single { .. } => {}
+                    abi::Variants::Single { .. } | abi::Variants::Empty => {}
                     abi::Variants::Multiple { variants, .. } => {
                         // Treat enum variants like union members.
                         // HACK(eddyb) pretend the `enum` field (discriminant)
diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs
index f2b50ae408e..226a46f605c 100644
--- a/compiler/rustc_abi/src/layout.rs
+++ b/compiler/rustc_abi/src/layout.rs
@@ -120,7 +120,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
             .max_by_key(|niche| niche.available(dl));
 
         LayoutData {
-            variants: Variants::Single { index: Some(VariantIdx::new(0)) },
+            variants: Variants::Single { index: VariantIdx::new(0) },
             fields: FieldsShape::Arbitrary {
                 offsets: [Size::ZERO, b_offset].into(),
                 memory_index: [0, 1].into(),
@@ -213,8 +213,9 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
         &self,
     ) -> LayoutData<FieldIdx, VariantIdx> {
         let dl = self.cx.data_layout();
+        // This is also used for uninhabited enums, so we use `Variants::Empty`.
         LayoutData {
-            variants: Variants::Single { index: None },
+            variants: Variants::Empty,
             fields: FieldsShape::Primitive,
             backend_repr: BackendRepr::Uninhabited,
             largest_niche: None,
@@ -385,7 +386,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
         };
 
         Ok(LayoutData {
-            variants: Variants::Single { index: Some(only_variant_idx) },
+            variants: Variants::Single { index: only_variant_idx },
             fields: FieldsShape::Union(union_field_count),
             backend_repr: abi,
             largest_niche: None,
@@ -424,7 +425,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
         };
 
         let mut st = self.univariant(&variants[v], repr, kind)?;
-        st.variants = Variants::Single { index: Some(v) };
+        st.variants = Variants::Single { index: v };
 
         if is_unsafe_cell {
             let hide_niches = |scalar: &mut _| match scalar {
@@ -543,7 +544,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
                 .iter_enumerated()
                 .map(|(j, v)| {
                     let mut st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?;
-                    st.variants = Variants::Single { index: Some(j) };
+                    st.variants = Variants::Single { index: j };
 
                     align = align.max(st.align);
                     max_repr_align = max_repr_align.max(st.max_repr_align);
@@ -736,7 +737,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
                     repr,
                     StructKind::Prefixed(min_ity.size(), prefix_align),
                 )?;
-                st.variants = Variants::Single { index: Some(i) };
+                st.variants = Variants::Single { index: i };
                 // Find the first field we can't move later
                 // to make room for a larger discriminant.
                 for field_idx in st.fields.index_by_increasing_offset() {
@@ -1004,8 +1005,8 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
             Variants::Multiple { tag, tag_encoding, tag_field, .. } => {
                 Variants::Multiple { tag, tag_encoding, tag_field, variants: best_layout.variants }
             }
-            Variants::Single { .. } => {
-                panic!("encountered a single-variant enum during multi-variant layout")
+            Variants::Single { .. } | Variants::Empty => {
+                panic!("encountered a single-variant or empty enum during multi-variant layout")
             }
         };
         Ok(best_layout.layout)
@@ -1344,7 +1345,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
         };
 
         Ok(LayoutData {
-            variants: Variants::Single { index: Some(VariantIdx::new(0)) },
+            variants: Variants::Single { index: VariantIdx::new(0) },
             fields: FieldsShape::Arbitrary { offsets, memory_index },
             backend_repr: abi,
             largest_niche,
diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs
index 242e2cadd18..ca15f7d9920 100644
--- a/compiler/rustc_abi/src/lib.rs
+++ b/compiler/rustc_abi/src/lib.rs
@@ -1504,11 +1504,13 @@ impl BackendRepr {
 #[derive(PartialEq, Eq, Hash, Clone, Debug)]
 #[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
 pub enum Variants<FieldIdx: Idx, VariantIdx: Idx> {
+    /// A type with no valid variants. Must be uninhabited.
+    Empty,
+
     /// Single enum variants, structs/tuples, unions, and all non-ADTs.
     Single {
-        /// Always `Some(0)` for types without variants (i.e., everything except for `!`, enums, and
-        /// generators). `None` indicates an uninhabited type; this is used for zero-variant enums.
-        index: Option<VariantIdx>,
+        /// Always `0` for types that cannot have multiple variants.
+        index: VariantIdx,
     },
 
     /// Enum-likes with more than one variant: each variant comes with
@@ -1706,7 +1708,7 @@ impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
         let size = scalar.size(cx);
         let align = scalar.align(cx);
         LayoutData {
-            variants: Variants::Single { index: Some(VariantIdx::new(0)) },
+            variants: Variants::Single { index: VariantIdx::new(0) },
             fields: FieldsShape::Primitive,
             backend_repr: BackendRepr::Scalar(scalar),
             largest_niche,
diff --git a/compiler/rustc_codegen_cranelift/src/discriminant.rs b/compiler/rustc_codegen_cranelift/src/discriminant.rs
index 055063c876f..4d0d5dc60eb 100644
--- a/compiler/rustc_codegen_cranelift/src/discriminant.rs
+++ b/compiler/rustc_codegen_cranelift/src/discriminant.rs
@@ -18,8 +18,9 @@ pub(crate) fn codegen_set_discriminant<'tcx>(
         return;
     }
     match layout.variants {
+        Variants::Empty => unreachable!("we already handled uninhabited types"),
         Variants::Single { index } => {
-            assert_eq!(index.unwrap(), variant_index);
+            assert_eq!(index, variant_index);
         }
         Variants::Multiple {
             tag: _,
@@ -85,11 +86,11 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
     }
 
     let (tag_scalar, tag_field, tag_encoding) = match &layout.variants {
+        Variants::Empty => unreachable!("we already handled uninhabited types"),
         Variants::Single { index } => {
-            let index = index.unwrap();
             let discr_val = layout
                 .ty
-                .discriminant_for_variant(fx.tcx, index)
+                .discriminant_for_variant(fx.tcx, *index)
                 .map_or(u128::from(index.as_u32()), |discr| discr.val);
 
             let val = match dest_layout.ty.kind() {
diff --git a/compiler/rustc_codegen_gcc/src/type_of.rs b/compiler/rustc_codegen_gcc/src/type_of.rs
index 426d28f4ed7..0efdf36da48 100644
--- a/compiler/rustc_codegen_gcc/src/type_of.rs
+++ b/compiler/rustc_codegen_gcc/src/type_of.rs
@@ -99,14 +99,14 @@ fn uncached_gcc_type<'gcc, 'tcx>(
             if !cx.sess().fewer_names() =>
         {
             let mut name = with_no_trimmed_paths!(layout.ty.to_string());
-            if let (&ty::Adt(def, _), &Variants::Single { index: Some(index) }) =
+            if let (&ty::Adt(def, _), &Variants::Single { index }) =
                 (layout.ty.kind(), &layout.variants)
             {
                 if def.is_enum() && !def.variants().is_empty() {
                     write!(&mut name, "::{}", def.variant(index).name).unwrap();
                 }
             }
-            if let (&ty::Coroutine(_, _), &Variants::Single { index: Some(index) }) =
+            if let (&ty::Coroutine(_, _), &Variants::Single { index }) =
                 (layout.ty.kind(), &layout.variants)
             {
                 write!(&mut name, "::{}", ty::CoroutineArgs::variant_name(index)).unwrap();
@@ -230,7 +230,7 @@ impl<'tcx> LayoutGccExt<'tcx> for TyAndLayout<'tcx> {
 
         // Check the cache.
         let variant_index = match self.variants {
-            Variants::Single { index } => index,
+            Variants::Single { index } => Some(index),
             _ => None,
         };
         let cached_type = cx.types.borrow().get(&(self.ty, variant_index)).cloned();
diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs
index 8ec83fa7c92..12a46184d10 100644
--- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs
+++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs
@@ -212,21 +212,18 @@ pub(super) fn build_enum_type_di_node<'ll, 'tcx>(
         ),
         |cx, enum_type_di_node| {
             match enum_type_and_layout.variants {
-                Variants::Single { index: variant_index } => {
-                    let Some(variant_index) = variant_index else {
-                        // Uninhabited enums have Variants::Single. We don't generate
-                        // any members for them.
-                        return smallvec![];
-                    };
-
-                    build_single_variant_union_fields(
-                        cx,
-                        enum_adt_def,
-                        enum_type_and_layout,
-                        enum_type_di_node,
-                        variant_index,
-                    )
+                Variants::Empty => {
+                    // Uninhabited enums have Variants::Single. We don't generate
+                    // any members for them.
+                    return smallvec![];
                 }
+                Variants::Single { index: variant_index } => build_single_variant_union_fields(
+                    cx,
+                    enum_adt_def,
+                    enum_type_and_layout,
+                    enum_type_di_node,
+                    variant_index,
+                ),
                 Variants::Multiple {
                     tag_encoding: TagEncoding::Direct,
                     ref variants,
@@ -303,6 +300,7 @@ pub(super) fn build_coroutine_di_node<'ll, 'tcx>(
                 )
             }
             Variants::Single { .. }
+            | Variants::Empty
             | Variants::Multiple { tag_encoding: TagEncoding::Niche { .. }, .. } => {
                 bug!(
                     "Encountered coroutine with non-direct-tag layout: {:?}",
diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs
index 65ab22ad89e..9f6a5cc89e0 100644
--- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs
+++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs
@@ -392,7 +392,7 @@ fn compute_discriminant_value<'ll, 'tcx>(
     variant_index: VariantIdx,
 ) -> DiscrResult {
     match enum_type_and_layout.layout.variants() {
-        &Variants::Single { .. } => DiscrResult::NoDiscriminant,
+        &Variants::Single { .. } | &Variants::Empty => DiscrResult::NoDiscriminant,
         &Variants::Multiple { tag_encoding: TagEncoding::Direct, .. } => DiscrResult::Value(
             enum_type_and_layout.ty.discriminant_for_variant(cx.tcx, variant_index).unwrap().val,
         ),
diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs
index 241bf167a81..11824398f24 100644
--- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs
+++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs
@@ -358,8 +358,8 @@ fn build_discr_member_di_node<'ll, 'tcx>(
     let containing_scope = enum_or_coroutine_type_di_node;
 
     match enum_or_coroutine_type_and_layout.layout.variants() {
-        // A single-variant enum has no discriminant.
-        &Variants::Single { .. } => None,
+        // A single-variant or no-variant enum has no discriminant.
+        &Variants::Single { .. } | &Variants::Empty => None,
 
         &Variants::Multiple { tag_field, .. } => {
             let tag_base_type = tag_base_type(cx.tcx, enum_or_coroutine_type_and_layout);
diff --git a/compiler/rustc_codegen_llvm/src/type_of.rs b/compiler/rustc_codegen_llvm/src/type_of.rs
index 833a687fe74..b0b6da869da 100644
--- a/compiler/rustc_codegen_llvm/src/type_of.rs
+++ b/compiler/rustc_codegen_llvm/src/type_of.rs
@@ -35,14 +35,14 @@ fn uncached_llvm_type<'a, 'tcx>(
             if !cx.sess().fewer_names() =>
         {
             let mut name = with_no_visible_paths!(with_no_trimmed_paths!(layout.ty.to_string()));
-            if let (&ty::Adt(def, _), &Variants::Single { index: Some(index) }) =
+            if let (&ty::Adt(def, _), &Variants::Single { index }) =
                 (layout.ty.kind(), &layout.variants)
             {
                 if def.is_enum() {
                     write!(&mut name, "::{}", def.variant(index).name).unwrap();
                 }
             }
-            if let (&ty::Coroutine(_, _), &Variants::Single { index: Some(index) }) =
+            if let (&ty::Coroutine(_, _), &Variants::Single { index }) =
                 (layout.ty.kind(), &layout.variants)
             {
                 write!(&mut name, "::{}", ty::CoroutineArgs::variant_name(index)).unwrap();
@@ -216,7 +216,7 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
 
         // Check the cache.
         let variant_index = match self.variants {
-            Variants::Single { index } => index,
+            Variants::Single { index } => Some(index),
             _ => None,
         };
         if let Some(llty) = cx.type_lowering.borrow().get(&(self.ty, variant_index)) {
diff --git a/compiler/rustc_codegen_ssa/src/debuginfo/mod.rs b/compiler/rustc_codegen_ssa/src/debuginfo/mod.rs
index 88d36b19da4..7c62c03d574 100644
--- a/compiler/rustc_codegen_ssa/src/debuginfo/mod.rs
+++ b/compiler/rustc_codegen_ssa/src/debuginfo/mod.rs
@@ -65,8 +65,8 @@ fn tag_base_type_opt<'tcx>(
     });
 
     match enum_type_and_layout.layout.variants() {
-        // A single-variant enum has no discriminant.
-        Variants::Single { .. } => None,
+        // A single-variant or no-variant enum has no discriminant.
+        Variants::Single { .. } | Variants::Empty => None,
 
         Variants::Multiple { tag_encoding: TagEncoding::Niche { .. }, tag, .. } => {
             // Niche tags are always normalized to unsized integers of the correct size.
diff --git a/compiler/rustc_codegen_ssa/src/mir/place.rs b/compiler/rustc_codegen_ssa/src/mir/place.rs
index cef3d8255a0..c634f864ffb 100644
--- a/compiler/rustc_codegen_ssa/src/mir/place.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/place.rs
@@ -243,8 +243,8 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
             return bx.cx().const_poison(cast_to);
         }
         let (tag_scalar, tag_encoding, tag_field) = match self.layout.variants {
+            Variants::Empty => unreachable!("we already handled uninhabited types"),
             Variants::Single { index } => {
-                let index = index.unwrap(); // we already checked `is_uninhabited`
                 let discr_val = self
                     .layout
                     .ty
@@ -366,9 +366,9 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
             return;
         }
         match self.layout.variants {
-            Variants::Single { index } => {
-                assert_eq!(index.unwrap(), variant_index);
-            }
+            Variants::Empty => unreachable!("we already handled uninhabited types"),
+            Variants::Single { index } => assert_eq!(index, variant_index),
+
             Variants::Multiple { tag_encoding: TagEncoding::Direct, tag_field, .. } => {
                 let ptr = self.project_field(bx, tag_field);
                 let to =
diff --git a/compiler/rustc_const_eval/src/interpret/discriminant.rs b/compiler/rustc_const_eval/src/interpret/discriminant.rs
index 6cfd1613229..2f0b1cb6d1e 100644
--- a/compiler/rustc_const_eval/src/interpret/discriminant.rs
+++ b/compiler/rustc_const_eval/src/interpret/discriminant.rs
@@ -65,15 +65,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
         // We use "tag" to refer to how the discriminant is encoded in memory, which can be either
         // straight-forward (`TagEncoding::Direct`) or with a niche (`TagEncoding::Niche`).
         let (tag_scalar_layout, tag_encoding, tag_field) = match op.layout().variants {
+            Variants::Empty => {
+                throw_ub!(UninhabitedEnumVariantRead(None));
+            }
             Variants::Single { index } => {
                 if op.layout().is_uninhabited() {
                     // For consistency with `write_discriminant`, and to make sure that
                     // `project_downcast` cannot fail due to strange layouts, we declare immediate UB
                     // for uninhabited enums.
-                    throw_ub!(UninhabitedEnumVariantRead(None));
+                    throw_ub!(UninhabitedEnumVariantRead(Some(index)));
                 }
                 // Since the type is inhabited, there must be an index.
-                return interp_ok(index.unwrap());
+                return interp_ok(index);
             }
             Variants::Multiple { tag, ref tag_encoding, tag_field, .. } => {
                 (tag, tag_encoding, tag_field)
@@ -238,6 +241,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
         }
 
         match layout.variants {
+            abi::Variants::Empty => unreachable!("we already handled uninhabited types"),
             abi::Variants::Single { .. } => {
                 // The tag of a `Single` enum is like the tag of the niched
                 // variant: there's no tag as the discriminant is encoded
diff --git a/compiler/rustc_const_eval/src/interpret/validity.rs b/compiler/rustc_const_eval/src/interpret/validity.rs
index 832183b42dc..6f101395ccf 100644
--- a/compiler/rustc_const_eval/src/interpret/validity.rs
+++ b/compiler/rustc_const_eval/src/interpret/validity.rs
@@ -302,7 +302,7 @@ impl<'rt, 'tcx, M: Machine<'tcx>> ValidityVisitor<'rt, 'tcx, M> {
                     };
                 }
             }
-            Variants::Single { .. } => {}
+            Variants::Single { .. } | Variants::Empty => {}
         }
 
         // Now we know we are projecting to a field, so figure out which one.
@@ -342,10 +342,9 @@ impl<'rt, 'tcx, M: Machine<'tcx>> ValidityVisitor<'rt, 'tcx, M> {
                 match layout.variants {
                     Variants::Single { index } => {
                         // Inside a variant
-                        PathElem::Field(
-                            def.variant(index.unwrap()).fields[FieldIdx::from_usize(field)].name,
-                        )
+                        PathElem::Field(def.variant(index).fields[FieldIdx::from_usize(field)].name)
                     }
+                    Variants::Empty => panic!("there is no field in Variants::Empty types"),
                     Variants::Multiple { .. } => bug!("we handled variants above"),
                 }
             }
@@ -1012,7 +1011,7 @@ impl<'rt, 'tcx, M: Machine<'tcx>> ValidityVisitor<'rt, 'tcx, M> {
             }
             // Don't forget potential other variants.
             match &layout.variants {
-                Variants::Single { .. } => {
+                Variants::Single { .. } | Variants::Empty => {
                     // Fully handled above.
                 }
                 Variants::Multiple { variants, .. } => {
diff --git a/compiler/rustc_const_eval/src/interpret/visitor.rs b/compiler/rustc_const_eval/src/interpret/visitor.rs
index 76ab0bb544f..3647c109a6e 100644
--- a/compiler/rustc_const_eval/src/interpret/visitor.rs
+++ b/compiler/rustc_const_eval/src/interpret/visitor.rs
@@ -218,8 +218,8 @@ pub trait ValueVisitor<'tcx, M: Machine<'tcx>>: Sized {
                 // recurse with the inner type
                 self.visit_variant(v, idx, &inner)?;
             }
-            // For single-variant layouts, we already did anything there is to do.
-            Variants::Single { .. } => {}
+            // For single-variant layouts, we already did everything there is to do.
+            Variants::Single { .. } | Variants::Empty => {}
         }
 
         interp_ok(())
diff --git a/compiler/rustc_const_eval/src/util/check_validity_requirement.rs b/compiler/rustc_const_eval/src/util/check_validity_requirement.rs
index 651a797e97c..a729d9325c8 100644
--- a/compiler/rustc_const_eval/src/util/check_validity_requirement.rs
+++ b/compiler/rustc_const_eval/src/util/check_validity_requirement.rs
@@ -155,6 +155,7 @@ fn check_validity_requirement_lax<'tcx>(
     }
 
     match &this.variants {
+        Variants::Empty => return Ok(false),
         Variants::Single { .. } => {
             // All fields of this single variant have already been checked above, there is nothing
             // else to do.
diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs
index 5f7b30b5d04..367b0c07f9b 100644
--- a/compiler/rustc_middle/src/ty/layout.rs
+++ b/compiler/rustc_middle/src/ty/layout.rs
@@ -734,23 +734,22 @@ where
         let layout = match this.variants {
             Variants::Single { index }
                 // If all variants but one are uninhabited, the variant layout is the enum layout.
-                if index == Some(variant_index) &&
-                // Don't confuse variants of uninhabited enums with the enum itself.
-                // For more details see https://github.com/rust-lang/rust/issues/69763.
-                this.fields != FieldsShape::Primitive =>
+                if index == variant_index =>
             {
                 this.layout
             }
 
-            Variants::Single { index } => {
-                // `Single` variant enums *can* have other variants, but those are uninhabited.
+            Variants::Single { .. } | Variants::Empty => {
+                // Single-variant and no-variant enums *can* have other variants, but those are
+                // uninhabited. Produce a layout that has the right fields for that variant, so that
+                // the rest of the compiler can project fields etc as usual.
 
                 let tcx = cx.tcx();
                 let typing_env = cx.typing_env();
 
                 // Deny calling for_variant more than once for non-Single enums.
                 if let Ok(original_layout) = tcx.layout_of(typing_env.as_query_input(this.ty)) {
-                    assert_eq!(original_layout.variants, Variants::Single { index });
+                    assert_eq!(original_layout.variants, this.variants);
                 }
 
                 let fields = match this.ty.kind() {
@@ -760,7 +759,7 @@ where
                     _ => bug!("`ty_and_layout_for_variant` on unexpected type {}", this.ty),
                 };
                 tcx.mk_layout(LayoutData {
-                    variants: Variants::Single { index: Some(variant_index) },
+                    variants: Variants::Single { index: variant_index },
                     fields: match NonZero::new(fields) {
                         Some(fields) => FieldsShape::Union(fields),
                         None => FieldsShape::Arbitrary { offsets: IndexVec::new(), memory_index: IndexVec::new() },
@@ -777,7 +776,7 @@ where
             Variants::Multiple { ref variants, .. } => cx.tcx().mk_layout(variants[variant_index].clone()),
         };
 
-        assert_eq!(*layout.variants(), Variants::Single { index: Some(variant_index) });
+        assert_eq!(*layout.variants(), Variants::Single { index: variant_index });
 
         TyAndLayout { ty: this.ty, layout }
     }
@@ -904,10 +903,11 @@ where
                 ),
 
                 ty::Coroutine(def_id, args) => match this.variants {
+                    Variants::Empty => unreachable!(),
                     Variants::Single { index } => TyMaybeWithLayout::Ty(
                         args.as_coroutine()
                             .state_tys(def_id, tcx)
-                            .nth(index.unwrap().as_usize())
+                            .nth(index.as_usize())
                             .unwrap()
                             .nth(i)
                             .unwrap(),
@@ -926,10 +926,10 @@ where
                 ty::Adt(def, args) => {
                     match this.variants {
                         Variants::Single { index } => {
-                            let field =
-                                &def.variant(index.unwrap()).fields[FieldIdx::from_usize(i)];
+                            let field = &def.variant(index).fields[FieldIdx::from_usize(i)];
                             TyMaybeWithLayout::Ty(field.ty(tcx, args))
                         }
+                        Variants::Empty => panic!("there is no field in Variants::Empty types"),
 
                         // Discriminant field for enums (where applicable).
                         Variants::Multiple { tag, .. } => {
diff --git a/compiler/rustc_mir_transform/src/large_enums.rs b/compiler/rustc_mir_transform/src/large_enums.rs
index 8be5a63d008..490e7dd8f7e 100644
--- a/compiler/rustc_mir_transform/src/large_enums.rs
+++ b/compiler/rustc_mir_transform/src/large_enums.rs
@@ -216,7 +216,7 @@ impl EnumSizeOpt {
         };
         let layout = tcx.layout_of(typing_env.as_query_input(ty)).ok()?;
         let variants = match &layout.variants {
-            Variants::Single { .. } => return None,
+            Variants::Single { .. } | Variants::Empty => return None,
             Variants::Multiple { tag_encoding: TagEncoding::Niche { .. }, .. } => return None,
 
             Variants::Multiple { variants, .. } if variants.len() <= 1 => return None,
diff --git a/compiler/rustc_mir_transform/src/unreachable_enum_branching.rs b/compiler/rustc_mir_transform/src/unreachable_enum_branching.rs
index 0ce3955163b..55dcad0680a 100644
--- a/compiler/rustc_mir_transform/src/unreachable_enum_branching.rs
+++ b/compiler/rustc_mir_transform/src/unreachable_enum_branching.rs
@@ -54,11 +54,11 @@ fn variant_discriminants<'tcx>(
     tcx: TyCtxt<'tcx>,
 ) -> FxHashSet<u128> {
     match &layout.variants {
-        Variants::Single { index: None } => {
+        Variants::Empty => {
             // Uninhabited, no valid discriminant.
             FxHashSet::default()
         }
-        Variants::Single { index: Some(index) } => {
+        Variants::Single { index } => {
             let mut res = FxHashSet::default();
             res.insert(
                 ty.discriminant_for_variant(tcx, *index)
diff --git a/compiler/rustc_smir/src/rustc_smir/convert/abi.rs b/compiler/rustc_smir/src/rustc_smir/convert/abi.rs
index 2717f4ab62f..b39a15a8633 100644
--- a/compiler/rustc_smir/src/rustc_smir/convert/abi.rs
+++ b/compiler/rustc_smir/src/rustc_smir/convert/abi.rs
@@ -164,9 +164,10 @@ impl<'tcx> Stable<'tcx> for rustc_abi::Variants<rustc_abi::FieldIdx, rustc_abi::
 
     fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
         match self {
-            rustc_abi::Variants::Single { index } => VariantsShape::Single {
-                index: index.unwrap_or(rustc_abi::VariantIdx::from_u32(0)).stable(tables),
-            },
+            rustc_abi::Variants::Single { index } => {
+                VariantsShape::Single { index: index.stable(tables) }
+            }
+            rustc_abi::Variants::Empty => VariantsShape::Empty,
             rustc_abi::Variants::Multiple { tag, tag_encoding, tag_field, variants } => {
                 VariantsShape::Multiple {
                     tag: tag.stable(tables),
diff --git a/compiler/rustc_target/src/callconv/loongarch.rs b/compiler/rustc_target/src/callconv/loongarch.rs
index d1234c3cc91..8bf61cb1337 100644
--- a/compiler/rustc_target/src/callconv/loongarch.rs
+++ b/compiler/rustc_target/src/callconv/loongarch.rs
@@ -116,7 +116,7 @@ where
             FieldsShape::Arbitrary { .. } => {
                 match arg_layout.variants {
                     abi::Variants::Multiple { .. } => return Err(CannotUseFpConv),
-                    abi::Variants::Single { .. } => (),
+                    abi::Variants::Single { .. } | abi::Variants::Empty => (),
                 }
                 for i in arg_layout.fields.index_by_increasing_offset() {
                     let field = arg_layout.field(cx, i);
diff --git a/compiler/rustc_target/src/callconv/riscv.rs b/compiler/rustc_target/src/callconv/riscv.rs
index c0298edb5ab..4d858392c97 100644
--- a/compiler/rustc_target/src/callconv/riscv.rs
+++ b/compiler/rustc_target/src/callconv/riscv.rs
@@ -122,7 +122,7 @@ where
             FieldsShape::Arbitrary { .. } => {
                 match arg_layout.variants {
                     abi::Variants::Multiple { .. } => return Err(CannotUseFpConv),
-                    abi::Variants::Single { .. } => (),
+                    abi::Variants::Single { .. } | abi::Variants::Empty => (),
                 }
                 for i in arg_layout.fields.index_by_increasing_offset() {
                     let field = arg_layout.field(cx, i);
diff --git a/compiler/rustc_target/src/callconv/x86_64.rs b/compiler/rustc_target/src/callconv/x86_64.rs
index bd101b23ea1..37aecf323a1 100644
--- a/compiler/rustc_target/src/callconv/x86_64.rs
+++ b/compiler/rustc_target/src/callconv/x86_64.rs
@@ -65,7 +65,7 @@ where
                 }
 
                 match &layout.variants {
-                    abi::Variants::Single { .. } => {}
+                    abi::Variants::Single { .. } | abi::Variants::Empty => {}
                     abi::Variants::Multiple { variants, .. } => {
                         // Treat enum variants like union members.
                         for variant_idx in variants.indices() {
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs
index 049f4734e7b..4cc6292a3ee 100644
--- a/compiler/rustc_transmute/src/layout/tree.rs
+++ b/compiler/rustc_transmute/src/layout/tree.rs
@@ -338,14 +338,11 @@ pub(crate) mod rustc {
                 };
 
             match layout.variants() {
+                Variants::Empty => Ok(Self::uninhabited()),
                 Variants::Single { index } => {
-                    if let Some(index) = index {
-                        // `Variants::Single` on enums with variants denotes that
-                        // the enum delegates its layout to the variant at `index`.
-                        layout_of_variant(*index, None)
-                    } else {
-                        Ok(Self::uninhabited())
-                    }
+                    // `Variants::Single` on enums with variants denotes that
+                    // the enum delegates its layout to the variant at `index`.
+                    layout_of_variant(*index, None)
                 }
                 Variants::Multiple { tag, tag_encoding, tag_field, .. } => {
                     // `Variants::Multiple` denotes an enum with multiple
@@ -498,13 +495,15 @@ pub(crate) mod rustc {
         (ty, layout): (Ty<'tcx>, Layout<'tcx>),
         i: FieldIdx,
     ) -> Ty<'tcx> {
+        // FIXME: Why does this not just use `ty_and_layout_field`?
         match ty.kind() {
             ty::Adt(def, args) => {
                 match layout.variants {
                     Variants::Single { index } => {
-                        let field = &def.variant(index.unwrap()).fields[i];
+                        let field = &def.variant(index).fields[i];
                         field.ty(cx.tcx(), args)
                     }
+                    Variants::Empty => panic!("there is no field in Variants::Empty types"),
                     // Discriminant field for enums (where applicable).
                     Variants::Multiple { tag, .. } => {
                         assert_eq!(i.as_usize(), 0);
diff --git a/compiler/rustc_ty_utils/src/layout.rs b/compiler/rustc_ty_utils/src/layout.rs
index b393190a493..a3b2ed07d4b 100644
--- a/compiler/rustc_ty_utils/src/layout.rs
+++ b/compiler/rustc_ty_utils/src/layout.rs
@@ -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, .. } => {
diff --git a/compiler/rustc_ty_utils/src/layout/invariant.rs b/compiler/rustc_ty_utils/src/layout/invariant.rs
index 7e2375154c0..8d5403ed324 100644
--- a/compiler/rustc_ty_utils/src/layout/invariant.rs
+++ b/compiler/rustc_ty_utils/src/layout/invariant.rs
@@ -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, .. } => {
diff --git a/compiler/stable_mir/src/abi.rs b/compiler/stable_mir/src/abi.rs
index cf28a0c5885..17e6a852022 100644
--- a/compiler/stable_mir/src/abi.rs
+++ b/compiler/stable_mir/src/abi.rs
@@ -180,8 +180,10 @@ impl FieldsShape {
 
 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize)]
 pub enum VariantsShape {
+    /// A type with no valid variants. Must be uninhabited.
+    Empty,
+
     /// Single enum variants, structs/tuples, unions, and all non-ADTs.
-    // FIXME: needs to become `Option` like in the internal type.
     Single { index: VariantIdx },
 
     /// Enum-likes with more than one inhabited variant: each variant comes with
diff --git a/src/tools/miri/src/helpers.rs b/src/tools/miri/src/helpers.rs
index 1f7c60ad1bd..ef4543dcee8 100644
--- a/src/tools/miri/src/helpers.rs
+++ b/src/tools/miri/src/helpers.rs
@@ -605,7 +605,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
                             // `UnsafeCell` action.
                             (self.unsafe_cell_action)(v)
                         }
-                        Variants::Single { .. } => {
+                        Variants::Single { .. } | Variants::Empty => {
                             // Proceed further, try to find where exactly that `UnsafeCell`
                             // is hiding.
                             self.walk_value(v)
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/layout.rs b/src/tools/rust-analyzer/crates/hir-ty/src/layout.rs
index 08026f11c83..0c1f63880cd 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/layout.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/layout.rs
@@ -189,7 +189,7 @@ fn layout_of_simd_ty(
     };
 
     Ok(Arc::new(Layout {
-        variants: Variants::Single { index: Some(struct_variant_idx()) },
+        variants: Variants::Single { index: struct_variant_idx() },
         fields,
         backend_repr: BackendRepr::Vector { element: e_abi, count: e_len },
         largest_niche: e_ly.largest_niche,
@@ -305,7 +305,7 @@ pub fn layout_of_ty_query(
             let largest_niche = if count != 0 { element.largest_niche } else { None };
 
             Layout {
-                variants: Variants::Single { index: Some(struct_variant_idx()) },
+                variants: Variants::Single { index: struct_variant_idx() },
                 fields: FieldsShape::Array { stride: element.size, count },
                 backend_repr,
                 largest_niche,
@@ -318,7 +318,7 @@ pub fn layout_of_ty_query(
         TyKind::Slice(element) => {
             let element = db.layout_of_ty(element.clone(), trait_env)?;
             Layout {
-                variants: Variants::Single { index: Some(struct_variant_idx()) },
+                variants: Variants::Single { index: struct_variant_idx() },
                 fields: FieldsShape::Array { stride: element.size, count: 0 },
                 backend_repr: BackendRepr::Memory { sized: false },
                 largest_niche: None,
@@ -329,7 +329,7 @@ pub fn layout_of_ty_query(
             }
         }
         TyKind::Str => Layout {
-            variants: Variants::Single { index: Some(struct_variant_idx()) },
+            variants: Variants::Single { index: struct_variant_idx() },
             fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
             backend_repr: BackendRepr::Memory { sized: false },
             largest_niche: None,
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/mir/eval.rs b/src/tools/rust-analyzer/crates/hir-ty/src/mir/eval.rs
index 9375853e915..e3072d6ee79 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/mir/eval.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/mir/eval.rs
@@ -813,7 +813,7 @@ impl Evaluator<'_> {
                 ProjectionElem::Field(Either::Left(f)) => {
                     let layout = self.layout(&prev_ty)?;
                     let variant_layout = match &layout.variants {
-                        Variants::Single { .. } => &layout,
+                        Variants::Single { .. } | Variants::Empty => &layout,
                         Variants::Multiple { variants, .. } => {
                             &variants[match f.parent {
                                 hir_def::VariantId::EnumVariantId(it) => {
@@ -1638,9 +1638,9 @@ impl Evaluator<'_> {
             return Ok(0);
         };
         match &layout.variants {
+            Variants::Empty => unreachable!(),
             Variants::Single { index } => {
-                let r = self
-                    .const_eval_discriminant(self.db.enum_data(e).variants[index.unwrap().0].0)?;
+                let r = self.const_eval_discriminant(self.db.enum_data(e).variants[index.0].0)?;
                 Ok(r)
             }
             Variants::Multiple { tag, tag_encoding, variants, .. } => {
@@ -1801,7 +1801,7 @@ impl Evaluator<'_> {
         }
         let layout = self.layout_adt(adt, subst)?;
         Ok(match &layout.variants {
-            Variants::Single { .. } => (layout.size.bytes_usize(), layout, None),
+            Variants::Single { .. } | Variants::Empty => (layout.size.bytes_usize(), layout, None),
             Variants::Multiple { variants, tag, tag_encoding, .. } => {
                 let enum_variant_id = match it {
                     VariantId::EnumVariantId(it) => it,
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/utils.rs b/src/tools/rust-analyzer/crates/hir-ty/src/utils.rs
index 43ed6a06f42..42e7edaf0f4 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/utils.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/utils.rs
@@ -334,8 +334,9 @@ pub(crate) fn detect_variant_from_bytes<'a>(
     e: EnumId,
 ) -> Option<(EnumVariantId, &'a Layout)> {
     let (var_id, var_layout) = match &layout.variants {
+        hir_def::layout::Variants::Empty => unreachable!(),
         hir_def::layout::Variants::Single { index } => {
-            (db.enum_data(e).variants[index.unwrap().0].0, layout)
+            (db.enum_data(e).variants[index.0].0, layout)
         }
         hir_def::layout::Variants::Multiple { tag, tag_encoding, variants, .. } => {
             let size = tag.size(target_data_layout).bytes_usize();
diff --git a/tests/ui/abi/c-zst.aarch64-darwin.stderr b/tests/ui/abi/c-zst.aarch64-darwin.stderr
index aae92bd7dc9..7d384bc875f 100644
--- a/tests/ui/abi/c-zst.aarch64-darwin.stderr
+++ b/tests/ui/abi/c-zst.aarch64-darwin.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -47,9 +45,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/c-zst.powerpc-linux.stderr b/tests/ui/abi/c-zst.powerpc-linux.stderr
index 4ff4a8b90cf..7980710bab6 100644
--- a/tests/ui/abi/c-zst.powerpc-linux.stderr
+++ b/tests/ui/abi/c-zst.powerpc-linux.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -58,9 +56,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/c-zst.s390x-linux.stderr b/tests/ui/abi/c-zst.s390x-linux.stderr
index 4ff4a8b90cf..7980710bab6 100644
--- a/tests/ui/abi/c-zst.s390x-linux.stderr
+++ b/tests/ui/abi/c-zst.s390x-linux.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -58,9 +56,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/c-zst.sparc64-linux.stderr b/tests/ui/abi/c-zst.sparc64-linux.stderr
index 4ff4a8b90cf..7980710bab6 100644
--- a/tests/ui/abi/c-zst.sparc64-linux.stderr
+++ b/tests/ui/abi/c-zst.sparc64-linux.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -58,9 +56,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/c-zst.x86_64-linux.stderr b/tests/ui/abi/c-zst.x86_64-linux.stderr
index aae92bd7dc9..7d384bc875f 100644
--- a/tests/ui/abi/c-zst.x86_64-linux.stderr
+++ b/tests/ui/abi/c-zst.x86_64-linux.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -47,9 +45,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/c-zst.x86_64-pc-windows-gnu.stderr b/tests/ui/abi/c-zst.x86_64-pc-windows-gnu.stderr
index 4ff4a8b90cf..7980710bab6 100644
--- a/tests/ui/abi/c-zst.x86_64-pc-windows-gnu.stderr
+++ b/tests/ui/abi/c-zst.x86_64-pc-windows-gnu.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -58,9 +56,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/debug.stderr b/tests/ui/abi/debug.stderr
index 0cbdf366616..aa51c42c58d 100644
--- a/tests/ui/abi/debug.stderr
+++ b/tests/ui/abi/debug.stderr
@@ -21,9 +21,7 @@ error: fn_abi_of(test) = FnAbi {
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -69,9 +67,7 @@ error: fn_abi_of(test) = FnAbi {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -128,9 +124,7 @@ error: fn_abi_of(TestFnPtr) = FnAbi {
                                },
                            ),
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -167,9 +161,7 @@ error: fn_abi_of(TestFnPtr) = FnAbi {
                        fields: Primitive,
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -218,9 +210,7 @@ error: fn_abi_of(test_generic) = FnAbi {
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -254,9 +244,7 @@ error: fn_abi_of(test_generic) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -304,9 +292,7 @@ error: ABIs are not compatible
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -340,9 +326,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -378,9 +362,7 @@ error: ABIs are not compatible
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -414,9 +396,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -455,9 +435,7 @@ error: ABIs are not compatible
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -495,9 +473,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -530,9 +506,7 @@ error: ABIs are not compatible
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -570,9 +544,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -613,9 +585,7 @@ error: ABIs are not compatible
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -649,9 +619,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -687,9 +655,7 @@ error: ABIs are not compatible
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -723,9 +689,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -767,9 +731,7 @@ error: ABIs are not compatible
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -803,9 +765,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -841,9 +801,7 @@ error: ABIs are not compatible
                            fields: Primitive,
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -877,9 +835,7 @@ error: ABIs are not compatible
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
@@ -946,9 +902,7 @@ error: fn_abi_of(assoc_test) = FnAbi {
                                },
                            ),
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -984,9 +938,7 @@ error: fn_abi_of(assoc_test) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/sysv64-zst.stderr b/tests/ui/abi/sysv64-zst.stderr
index 920963c6987..8e1791e27d2 100644
--- a/tests/ui/abi/sysv64-zst.stderr
+++ b/tests/ui/abi/sysv64-zst.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -47,9 +45,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/win64-zst.x86_64-linux.stderr b/tests/ui/abi/win64-zst.x86_64-linux.stderr
index 2752555b4f3..76d90670eb1 100644
--- a/tests/ui/abi/win64-zst.x86_64-linux.stderr
+++ b/tests/ui/abi/win64-zst.x86_64-linux.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -47,9 +45,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/win64-zst.x86_64-windows-gnu.stderr b/tests/ui/abi/win64-zst.x86_64-windows-gnu.stderr
index 19abb5930b1..7ee90e24744 100644
--- a/tests/ui/abi/win64-zst.x86_64-windows-gnu.stderr
+++ b/tests/ui/abi/win64-zst.x86_64-windows-gnu.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -58,9 +56,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/abi/win64-zst.x86_64-windows-msvc.stderr b/tests/ui/abi/win64-zst.x86_64-windows-msvc.stderr
index 2752555b4f3..76d90670eb1 100644
--- a/tests/ui/abi/win64-zst.x86_64-windows-msvc.stderr
+++ b/tests/ui/abi/win64-zst.x86_64-windows-msvc.stderr
@@ -18,9 +18,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                            },
                            largest_niche: None,
                            variants: Single {
-                               index: Some(
-                                   0,
-                               ),
+                               index: 0,
                            },
                            max_repr_align: None,
                            unadjusted_abi_align: $SOME_ALIGN,
@@ -47,9 +45,7 @@ error: fn_abi_of(pass_zst) = FnAbi {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: $SOME_ALIGN,
diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr
index 8ae2933c427..bd31665dac1 100644
--- a/tests/ui/layout/debug.stderr
+++ b/tests/ui/layout/debug.stderr
@@ -57,9 +57,7 @@ error: layout_of(E) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -85,9 +83,7 @@ error: layout_of(E) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -138,9 +134,7 @@ error: layout_of(S) = Layout {
            },
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(4 bytes),
@@ -164,9 +158,7 @@ error: layout_of(U) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(4 bytes),
@@ -259,9 +251,7 @@ error: layout_of(Result<i32, i32>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -298,9 +288,7 @@ error: layout_of(Result<i32, i32>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -333,9 +321,7 @@ error: layout_of(i32) = Layout {
            fields: Primitive,
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(4 bytes),
@@ -359,9 +345,7 @@ error: layout_of(V) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(2 bytes),
@@ -385,9 +369,7 @@ error: layout_of(W) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(2 bytes),
@@ -411,9 +393,7 @@ error: layout_of(Y) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(2 bytes),
@@ -437,9 +417,7 @@ error: layout_of(P1) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(1 bytes),
@@ -463,9 +441,7 @@ error: layout_of(P2) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(1 bytes),
@@ -489,9 +465,7 @@ error: layout_of(P3) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(1 bytes),
@@ -515,9 +489,7 @@ error: layout_of(P4) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(1 bytes),
@@ -546,9 +518,7 @@ error: layout_of(P5) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(1 bytes),
@@ -577,9 +547,7 @@ error: layout_of(MaybeUninit<u8>) = Layout {
            ),
            largest_niche: None,
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(1 bytes),
diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr
index a934f270911..59fe667923f 100644
--- a/tests/ui/layout/hexagon-enum.stderr
+++ b/tests/ui/layout/hexagon-enum.stderr
@@ -57,9 +57,7 @@ error: layout_of(A) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -133,9 +131,7 @@ error: layout_of(B) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -209,9 +205,7 @@ error: layout_of(C) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(2 bytes),
@@ -285,9 +279,7 @@ error: layout_of(P) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -361,9 +353,7 @@ error: layout_of(T) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr
index 8b4e46de845..ca041fb539b 100644
--- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr
+++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr
@@ -79,9 +79,7 @@ error: layout_of(MissingPayloadField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -101,9 +99,7 @@ error: layout_of(MissingPayloadField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -201,9 +197,7 @@ error: layout_of(CommonPayloadField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -240,9 +234,7 @@ error: layout_of(CommonPayloadField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -338,9 +330,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -376,9 +366,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -490,9 +478,7 @@ error: layout_of(NicheFirst) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -512,9 +498,7 @@ error: layout_of(NicheFirst) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -534,9 +518,7 @@ error: layout_of(NicheFirst) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               2,
-                           ),
+                           index: 2,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -648,9 +630,7 @@ error: layout_of(NicheSecond) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -670,9 +650,7 @@ error: layout_of(NicheSecond) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -692,9 +670,7 @@ error: layout_of(NicheSecond) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               2,
-                           ),
+                           index: 2,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr
index 92643445595..bc40a2aa482 100644
--- a/tests/ui/layout/issue-96185-overaligned-enum.stderr
+++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr
@@ -51,9 +51,7 @@ error: layout_of(Aligned1) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -75,9 +73,7 @@ error: layout_of(Aligned1) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -155,9 +151,7 @@ error: layout_of(Aligned2) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(1 bytes),
@@ -179,9 +173,7 @@ error: layout_of(Aligned2) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: Some(
                            Align(1 bytes),
diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr
index f35cf0dab3d..bf043af586b 100644
--- a/tests/ui/layout/thumb-enum.stderr
+++ b/tests/ui/layout/thumb-enum.stderr
@@ -57,9 +57,7 @@ error: layout_of(A) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -133,9 +131,7 @@ error: layout_of(B) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -209,9 +205,7 @@ error: layout_of(C) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(2 bytes),
@@ -285,9 +279,7 @@ error: layout_of(P) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -361,9 +353,7 @@ error: layout_of(T) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr
index 4c6f636b267..d61408098df 100644
--- a/tests/ui/layout/zero-sized-array-enum-niche.stderr
+++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr
@@ -55,9 +55,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -90,9 +88,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -164,9 +160,7 @@ error: layout_of(MultipleAlignments) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(2 bytes),
@@ -190,9 +184,7 @@ error: layout_of(MultipleAlignments) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -225,9 +217,7 @@ error: layout_of(MultipleAlignments) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               2,
-                           ),
+                           index: 2,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -299,9 +289,7 @@ error: layout_of(Result<[u32; 0], Packed<NonZero<u16>>>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -334,9 +322,7 @@ error: layout_of(Result<[u32; 0], Packed<NonZero<u16>>>) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -412,9 +398,7 @@ error: layout_of(Result<[u32; 0], Packed<U16IsZero>>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -447,9 +431,7 @@ error: layout_of(Result<[u32; 0], Packed<U16IsZero>>) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr
index 08fd4237eeb..64a0cb7f31a 100644
--- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr
+++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr
@@ -51,9 +51,7 @@ error: layout_of(Univariant) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -135,9 +133,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -173,9 +169,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -247,9 +241,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -275,9 +267,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(8 bytes),
diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr
index 473268cac1a..5c4daa6d519 100644
--- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr
+++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr
@@ -51,9 +51,7 @@ error: layout_of(Univariant) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -135,9 +133,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -173,9 +169,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -247,9 +241,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -275,9 +267,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(8 bytes),
diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr
index 08fd4237eeb..64a0cb7f31a 100644
--- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr
+++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr
@@ -51,9 +51,7 @@ error: layout_of(Univariant) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -135,9 +133,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -173,9 +169,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -247,9 +241,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -275,9 +267,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(8 bytes),
diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr
index 08fd4237eeb..64a0cb7f31a 100644
--- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr
+++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr
@@ -51,9 +51,7 @@ error: layout_of(Univariant) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -135,9 +133,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -173,9 +169,7 @@ error: layout_of(TwoVariants) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -247,9 +241,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -275,9 +267,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(8 bytes),
diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr
index 1200f120d37..75005a64523 100644
--- a/tests/ui/repr/repr-c-int-dead-variants.stderr
+++ b/tests/ui/repr/repr-c-int-dead-variants.stderr
@@ -51,9 +51,7 @@ error: layout_of(UnivariantU8) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -135,9 +133,7 @@ error: layout_of(TwoVariantsU8) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -173,9 +169,7 @@ error: layout_of(TwoVariantsU8) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -247,9 +241,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: Some(
                            Align(8 bytes),
@@ -275,9 +267,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(8 bytes),
diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr
index 9954471968d..0eed7c2ce1c 100644
--- a/tests/ui/type/pattern_types/range_patterns.stderr
+++ b/tests/ui/type/pattern_types/range_patterns.stderr
@@ -32,9 +32,7 @@ error: layout_of(NonZero<u32>) = Layout {
                },
            ),
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(4 bytes),
@@ -71,9 +69,7 @@ error: layout_of((u32) is 1..=) = Layout {
                },
            ),
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(4 bytes),
@@ -137,9 +133,7 @@ error: layout_of(Option<(u32) is 1..=>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -178,9 +172,7 @@ error: layout_of(Option<(u32) is 1..=>) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -249,9 +241,7 @@ error: layout_of(Option<NonZero<u32>>) = Layout {
                        },
                        largest_niche: None,
                        variants: Single {
-                           index: Some(
-                               0,
-                           ),
+                           index: 0,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(1 bytes),
@@ -290,9 +280,7 @@ error: layout_of(Option<NonZero<u32>>) = Layout {
                            },
                        ),
                        variants: Single {
-                           index: Some(
-                               1,
-                           ),
+                           index: 1,
                        },
                        max_repr_align: None,
                        unadjusted_abi_align: Align(4 bytes),
@@ -341,9 +329,7 @@ error: layout_of(NonZeroU32New) = Layout {
                },
            ),
            variants: Single {
-               index: Some(
-                   0,
-               ),
+               index: 0,
            },
            max_repr_align: None,
            unadjusted_abi_align: Align(4 bytes),