mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Rollup merge of #133702 - RalfJung:single-variant, r=oli-obk
Variants::Single: do not use invalid VariantIdx for uninhabited enums ~~Stacked on top of https://github.com/rust-lang/rust/pull/133681, only the last commit is new.~~ Currently, `Variants::Single` for an empty enum contains a `VariantIdx` of 0; looking that up in the enum variant list will ICE. That's quite confusing. So let's fix that by adding a new `Variants::Empty` case for types that have 0 variants. try-job: i686-msvc
This commit is contained in:
commit
e95b48b6d9
@ -813,7 +813,7 @@ impl Evaluator<'_> {
|
|||||||
ProjectionElem::Field(Either::Left(f)) => {
|
ProjectionElem::Field(Either::Left(f)) => {
|
||||||
let layout = self.layout(&prev_ty)?;
|
let layout = self.layout(&prev_ty)?;
|
||||||
let variant_layout = match &layout.variants {
|
let variant_layout = match &layout.variants {
|
||||||
Variants::Single { .. } => &layout,
|
Variants::Single { .. } | Variants::Empty => &layout,
|
||||||
Variants::Multiple { variants, .. } => {
|
Variants::Multiple { variants, .. } => {
|
||||||
&variants[match f.parent {
|
&variants[match f.parent {
|
||||||
hir_def::VariantId::EnumVariantId(it) => {
|
hir_def::VariantId::EnumVariantId(it) => {
|
||||||
@ -1638,6 +1638,7 @@ impl Evaluator<'_> {
|
|||||||
return Ok(0);
|
return Ok(0);
|
||||||
};
|
};
|
||||||
match &layout.variants {
|
match &layout.variants {
|
||||||
|
Variants::Empty => unreachable!(),
|
||||||
Variants::Single { index } => {
|
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.0].0)?;
|
||||||
Ok(r)
|
Ok(r)
|
||||||
@ -1800,7 +1801,7 @@ impl Evaluator<'_> {
|
|||||||
}
|
}
|
||||||
let layout = self.layout_adt(adt, subst)?;
|
let layout = self.layout_adt(adt, subst)?;
|
||||||
Ok(match &layout.variants {
|
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, .. } => {
|
Variants::Multiple { variants, tag, tag_encoding, .. } => {
|
||||||
let enum_variant_id = match it {
|
let enum_variant_id = match it {
|
||||||
VariantId::EnumVariantId(it) => it,
|
VariantId::EnumVariantId(it) => it,
|
||||||
|
@ -334,6 +334,7 @@ pub(crate) fn detect_variant_from_bytes<'a>(
|
|||||||
e: EnumId,
|
e: EnumId,
|
||||||
) -> Option<(EnumVariantId, &'a Layout)> {
|
) -> Option<(EnumVariantId, &'a Layout)> {
|
||||||
let (var_id, var_layout) = match &layout.variants {
|
let (var_id, var_layout) = match &layout.variants {
|
||||||
|
hir_def::layout::Variants::Empty => unreachable!(),
|
||||||
hir_def::layout::Variants::Single { index } => {
|
hir_def::layout::Variants::Single { index } => {
|
||||||
(db.enum_data(e).variants[index.0].0, layout)
|
(db.enum_data(e).variants[index.0].0, layout)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user