@@ -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
@@ -459,6 +460,25 @@ impl<'tcx> SmirCtxt<'tcx> {
459460 Discr { val : discr. val , ty : discr. ty . stable ( & mut * tables) }
460461 }
461462
463+ /// Discriminant for a given variand index and args of a coroutine
464+ pub fn coroutine_discr_for_variant (
465+ & self ,
466+ coroutine : CoroutineDef ,
467+ args : & GenericArgs ,
468+ variant : VariantIdx ,
469+ ) -> Discr {
470+ let mut tables = self . 0 . borrow_mut ( ) ;
471+ let tcx = tables. tcx ;
472+
473+ let discr = args. internal ( & mut * tables, tcx) . as_coroutine ( ) . discriminant_for_variant (
474+ coroutine. def_id ( ) . internal ( & mut * tables, tcx) ,
475+ tcx,
476+ variant. internal ( & mut * tables, tcx) ,
477+ ) ;
478+
479+ Discr { val : discr. val , ty : discr. ty . stable ( & mut * tables) }
480+ }
481+
462482 /// The name of a variant.
463483 pub fn variant_name ( & self , def : VariantDef ) -> Symbol {
464484 let mut tables = self . 0 . borrow_mut ( ) ;
0 commit comments