Skip to content

Commit 94f7790

Browse files
committed
Add discriminant_for_variant to AdtDef
1 parent 68ac5ab commit 94f7790

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

@@ -447,6 +447,18 @@ impl<'tcx> SmirCtxt<'tcx> {
447447
def.internal(&mut *tables, tcx).variants().len()
448448
}
449449

450+
/// Discriminant for a given variant index of AdtDef
451+
pub fn adt_discr_for_variant(&self, adt: AdtDef, variant: VariantIdx) -> Discr {
452+
let mut tables = self.0.borrow_mut();
453+
let tcx = tables.tcx;
454+
455+
let discr = adt
456+
.internal(&mut *tables, tcx)
457+
.discriminant_for_variant(tcx, variant.internal(&mut *tables, tcx));
458+
459+
Discr { val: discr.val, ty: discr.ty.stable(&mut *tables) }
460+
}
461+
450462
/// The name of a variant.
451463
pub fn variant_name(&self, def: VariantDef) -> Symbol {
452464
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,
@@ -230,6 +230,11 @@ impl<'tcx> SmirInterface<'tcx> {
230230
self.cx.adt_variants_len(def)
231231
}
232232

233+
/// Discriminant for a given variant index of AdtDef
234+
pub(crate) fn adt_discr_for_variant(&self, adt: AdtDef, variant: VariantIdx) -> Discr {
235+
self.cx.adt_discr_for_variant(adt, variant)
236+
}
237+
233238
/// The name of a variant.
234239
pub(crate) fn variant_name(&self, def: VariantDef) -> Symbol {
235240
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
@@ -831,6 +831,15 @@ impl AdtDef {
831831
pub fn repr(&self) -> ReprOptions {
832832
with(|cx| cx.adt_repr(*self))
833833
}
834+
835+
pub fn discriminant_for_variant(&self, idx: VariantIdx) -> Discr {
836+
with(|cx| cx.adt_discr_for_variant(*self, idx))
837+
}
838+
}
839+
840+
pub struct Discr {
841+
pub val: u128,
842+
pub ty: Ty,
834843
}
835844

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

0 commit comments

Comments
 (0)