@@ -12,7 +12,8 @@ use rustc_middle::ty::layout::{
1212} ;
1313use rustc_middle:: ty:: print:: { with_forced_trimmed_paths, with_no_trimmed_paths} ;
1414use rustc_middle:: ty:: {
15- GenericPredicates , Instance , List , ScalarInt , TyCtxt , TypeVisitableExt , ValTree ,
15+ CoroutineArgsExt , GenericPredicates , Instance , List , ScalarInt , TyCtxt , TypeVisitableExt ,
16+ ValTree ,
1617} ;
1718use rustc_middle:: { mir, ty} ;
1819use rustc_span:: def_id:: LOCAL_CRATE ;
@@ -22,9 +23,9 @@ use stable_mir::mir::mono::{InstanceDef, StaticDef};
2223use stable_mir:: mir:: { BinOp , Body , Place , UnOp } ;
2324use stable_mir:: target:: { MachineInfo , MachineSize } ;
2425use stable_mir:: ty:: {
25- AdtDef , AdtKind , Allocation , ClosureDef , ClosureKind , Discr , FieldDef , FnDef , ForeignDef ,
26- ForeignItemKind , GenericArgs , IntrinsicDef , LineInfo , MirConst , PolyFnSig , RigidTy , Span , Ty ,
27- TyConst , TyKind , UintTy , VariantDef , VariantIdx ,
26+ AdtDef , AdtKind , Allocation , ClosureDef , ClosureKind , CoroutineDef , Discr , FieldDef , FnDef ,
27+ ForeignDef , ForeignItemKind , GenericArgs , IntrinsicDef , LineInfo , MirConst , PolyFnSig , RigidTy ,
28+ Span , Ty , TyConst , TyKind , UintTy , VariantDef , VariantIdx ,
2829} ;
2930use stable_mir:: { Crate , CrateDef , CrateItem , CrateNum , DefId , Error , Filename , ItemKind , Symbol } ;
3031
@@ -452,6 +453,25 @@ impl<'tcx> SmirCtxt<'tcx> {
452453 Discr { val : discr. val , ty : discr. ty . stable ( & mut * tables) }
453454 }
454455
456+ /// Discriminant for a given variand index and args of a coroutine
457+ pub fn coroutine_discr_for_variant (
458+ & self ,
459+ coroutine : CoroutineDef ,
460+ args : & GenericArgs ,
461+ variant : VariantIdx ,
462+ ) -> Discr {
463+ let mut tables = self . 0 . borrow_mut ( ) ;
464+ let tcx = tables. tcx ;
465+
466+ let discr = args. internal ( & mut * tables, tcx) . as_coroutine ( ) . discriminant_for_variant (
467+ coroutine. def_id ( ) . internal ( & mut * tables, tcx) ,
468+ tcx,
469+ variant. internal ( & mut * tables, tcx) ,
470+ ) ;
471+
472+ Discr { val : discr. val , ty : discr. ty . stable ( & mut * tables) }
473+ }
474+
455475 /// The name of a variant.
456476 pub fn variant_name ( & self , def : VariantDef ) -> Symbol {
457477 let mut tables = self . 0 . borrow_mut ( ) ;
0 commit comments