Skip to content

Commit d7d08ae

Browse files
committed
Variants::Single: do not use invalid VariantIdx for uninhabited enums
1 parent 9321f7e commit d7d08ae

File tree

3 files changed

+7
-6
lines changed

3 files changed

+7
-6
lines changed

crates/hir-ty/src/layout.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ fn layout_of_simd_ty(
189189
};
190190

191191
Ok(Arc::new(Layout {
192-
variants: Variants::Single { index: struct_variant_idx() },
192+
variants: Variants::Single { index: Some(struct_variant_idx()) },
193193
fields,
194194
backend_repr: BackendRepr::Vector { element: e_abi, count: e_len },
195195
largest_niche: e_ly.largest_niche,
@@ -305,7 +305,7 @@ pub fn layout_of_ty_query(
305305
let largest_niche = if count != 0 { element.largest_niche } else { None };
306306

307307
Layout {
308-
variants: Variants::Single { index: struct_variant_idx() },
308+
variants: Variants::Single { index: Some(struct_variant_idx()) },
309309
fields: FieldsShape::Array { stride: element.size, count },
310310
backend_repr,
311311
largest_niche,
@@ -318,7 +318,7 @@ pub fn layout_of_ty_query(
318318
TyKind::Slice(element) => {
319319
let element = db.layout_of_ty(element.clone(), trait_env)?;
320320
Layout {
321-
variants: Variants::Single { index: struct_variant_idx() },
321+
variants: Variants::Single { index: Some(struct_variant_idx()) },
322322
fields: FieldsShape::Array { stride: element.size, count: 0 },
323323
backend_repr: BackendRepr::Memory { sized: false },
324324
largest_niche: None,
@@ -329,7 +329,7 @@ pub fn layout_of_ty_query(
329329
}
330330
}
331331
TyKind::Str => Layout {
332-
variants: Variants::Single { index: struct_variant_idx() },
332+
variants: Variants::Single { index: Some(struct_variant_idx()) },
333333
fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
334334
backend_repr: BackendRepr::Memory { sized: false },
335335
largest_niche: None,

crates/hir-ty/src/mir/eval.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1639,7 +1639,8 @@ impl Evaluator<'_> {
16391639
};
16401640
match &layout.variants {
16411641
Variants::Single { index } => {
1642-
let r = self.const_eval_discriminant(self.db.enum_data(e).variants[index.0].0)?;
1642+
let r = self
1643+
.const_eval_discriminant(self.db.enum_data(e).variants[index.unwrap().0].0)?;
16431644
Ok(r)
16441645
}
16451646
Variants::Multiple { tag, tag_encoding, variants, .. } => {

crates/hir-ty/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ pub(crate) fn detect_variant_from_bytes<'a>(
335335
) -> Option<(EnumVariantId, &'a Layout)> {
336336
let (var_id, var_layout) = match &layout.variants {
337337
hir_def::layout::Variants::Single { index } => {
338-
(db.enum_data(e).variants[index.0].0, layout)
338+
(db.enum_data(e).variants[index.unwrap().0].0, layout)
339339
}
340340
hir_def::layout::Variants::Multiple { tag, tag_encoding, variants, .. } => {
341341
let size = tag.size(target_data_layout).bytes_usize();

0 commit comments

Comments
 (0)