about summary refs log tree commit diff
path: root/src/tools/rust-analyzer
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-12-01 13:12:43 +0100
committerRalf Jung <post@ralfj.de>2024-12-18 11:00:21 +0100
commit21de42bf8ddd0f39c766c7705990152302ae1f3b (patch)
treefd27ee9da12fb8c8682f7aaddb4dc749cfa1bfe6 /src/tools/rust-analyzer
parent37e74596c0b59e81b9ac58657f92297ef4ccb7ef (diff)
downloadrust-21de42bf8ddd0f39c766c7705990152302ae1f3b.tar.gz
rust-21de42bf8ddd0f39c766c7705990152302ae1f3b.zip
Variants::Single: do not use invalid VariantIdx for uninhabited enums
Diffstat (limited to 'src/tools/rust-analyzer')
-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.rs3
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/utils.rs2
3 files changed, 7 insertions, 6 deletions
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 0c1f63880cd..08026f11c83 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: struct_variant_idx() },
+        variants: Variants::Single { index: Some(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: struct_variant_idx() },
+                variants: Variants::Single { index: Some(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: struct_variant_idx() },
+                variants: Variants::Single { index: Some(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: struct_variant_idx() },
+            variants: Variants::Single { index: Some(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 d7029651fc1..9375853e915 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
@@ -1639,7 +1639,8 @@ impl Evaluator<'_> {
         };
         match &layout.variants {
             Variants::Single { index } => {
-                let r = self.const_eval_discriminant(self.db.enum_data(e).variants[index.0].0)?;
+                let r = self
+                    .const_eval_discriminant(self.db.enum_data(e).variants[index.unwrap().0].0)?;
                 Ok(r)
             }
             Variants::Multiple { tag, tag_encoding, variants, .. } => {
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 06719b09f73..43ed6a06f42 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/utils.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/utils.rs
@@ -335,7 +335,7 @@ pub(crate) fn detect_variant_from_bytes<'a>(
 ) -> Option<(EnumVariantId, &'a Layout)> {
     let (var_id, var_layout) = match &layout.variants {
         hir_def::layout::Variants::Single { index } => {
-            (db.enum_data(e).variants[index.0].0, layout)
+            (db.enum_data(e).variants[index.unwrap().0].0, layout)
         }
         hir_def::layout::Variants::Multiple { tag, tag_encoding, variants, .. } => {
             let size = tag.size(target_data_layout).bytes_usize();