Skip to content

Commit b2bfa10

Browse files
committed
Add discriminant_for_variant to AdtDef
1 parent d76fe15 commit b2bfa10

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

compiler/rustc_smir/src/rustc_smir/context.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ use stable_mir::mir::mono::{InstanceDef, StaticDef};
2222
use stable_mir::mir::{BinOp, Body, Place, UnOp};
2323
use stable_mir::target::{MachineInfo, MachineSize};
2424
use stable_mir::ty::{
25-
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, FieldDef, FnDef, ForeignDef,
25+
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Discr, FieldDef, FnDef, ForeignDef,
2626
ForeignItemKind, GenericArgs, IntrinsicDef, LineInfo, MirConst, PolyFnSig, RigidTy, Span, Ty,
27-
TyConst, TyKind, UintTy, VariantDef,
27+
TyConst, TyKind, UintTy, VariantDef, VariantIdx,
2828
};
2929
use stable_mir::{Crate, CrateDef, CrateItem, CrateNum, DefId, Error, Filename, ItemKind, Symbol};
3030

@@ -440,6 +440,18 @@ impl<'tcx> SmirCtxt<'tcx> {
440440
def.internal(&mut *tables, tcx).variants().len()
441441
}
442442

443+
/// Discriminant for a given variant index of AdtDef
444+
pub fn adt_discr_for_variant(&self, adt: AdtDef, variant: VariantIdx) -> Discr {
445+
let mut tables = self.0.borrow_mut();
446+
let tcx = tables.tcx;
447+
448+
let discr = adt
449+
.internal(&mut *tables, tcx)
450+
.discriminant_for_variant(tcx, variant.internal(&mut *tables, tcx));
451+
452+
Discr { val: discr.val, ty: discr.ty.stable(&mut *tables) }
453+
}
454+
443455
/// The name of a variant.
444456
pub fn variant_name(&self, def: VariantDef) -> Symbol {
445457
let mut tables = self.0.borrow_mut();

compiler/rustc_smir/src/stable_mir/compiler_interface.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ use stable_mir::mir::mono::{Instance, InstanceDef, StaticDef};
1313
use stable_mir::mir::{BinOp, Body, Place, UnOp};
1414
use stable_mir::target::MachineInfo;
1515
use stable_mir::ty::{
16-
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, FieldDef, FnDef, ForeignDef,
16+
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Discr, FieldDef, FnDef, ForeignDef,
1717
ForeignItemKind, ForeignModule, ForeignModuleDef, GenericArgs, GenericPredicates, Generics,
1818
ImplDef, ImplTrait, IntrinsicDef, LineInfo, MirConst, PolyFnSig, RigidTy, Span, TraitDecl,
19-
TraitDef, Ty, TyConst, TyConstId, TyKind, UintTy, VariantDef,
19+
TraitDef, Ty, TyConst, TyConstId, TyKind, UintTy, VariantDef, VariantIdx,
2020
};
2121
use stable_mir::{
2222
AssocItems, Crate, CrateItem, CrateItems, CrateNum, DefId, Error, Filename, ImplTraitDecls,
@@ -225,6 +225,11 @@ impl<'tcx> SmirInterface<'tcx> {
225225
self.cx.adt_variants_len(def)
226226
}
227227

228+
/// Discriminant for a given variant index of AdtDef
229+
pub(crate) fn adt_discr_for_variant(&self, adt: AdtDef, variant: VariantIdx) -> Discr {
230+
self.cx.adt_discr_for_variant(adt, variant)
231+
}
232+
228233
/// The name of a variant.
229234
pub(crate) fn variant_name(&self, def: VariantDef) -> Symbol {
230235
self.cx.variant_name(def)

compiler/rustc_smir/src/stable_mir/ty.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,15 @@ impl AdtDef {
818818
pub fn variant(&self, idx: VariantIdx) -> Option<VariantDef> {
819819
(idx.to_index() < self.num_variants()).then_some(VariantDef { idx, adt_def: *self })
820820
}
821+
822+
pub fn discriminant_for_variant(&self, idx: VariantIdx) -> Discr {
823+
with(|cx| cx.adt_discr_for_variant(*self, idx))
824+
}
825+
}
826+
827+
pub struct Discr {
828+
pub val: u128,
829+
pub ty: Ty,
821830
}
822831

823832
/// Definition of a variant, which can be either a struct / union field or an enum variant.

0 commit comments

Comments
 (0)