@@ -23,6 +23,7 @@ use rustc::hir::def::CtorKind;
2323use rustc:: hir:: def_id:: { DefId , CrateNum , LOCAL_CRATE } ;
2424use rustc:: ich:: NodeIdHashingMode ;
2525use rustc:: mir:: Field ;
26+ use rustc:: mir:: GeneratorLayout ;
2627use rustc:: mir:: interpret:: truncate;
2728use rustc_data_structures:: fingerprint:: Fingerprint ;
2829use rustc:: ty:: Instance ;
@@ -1291,7 +1292,10 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
12911292 let variant_info_for = |index : VariantIdx | {
12921293 match & self . enum_type . sty {
12931294 ty:: Adt ( adt, _) => VariantInfo :: Adt ( & adt. variants [ index] ) ,
1294- ty:: Generator ( _, substs, _) => VariantInfo :: Generator ( * substs, index) ,
1295+ ty:: Generator ( def_id, substs, _) => {
1296+ let generator_layout = cx. tcx . generator_layout ( * def_id) ;
1297+ VariantInfo :: Generator ( * substs, generator_layout, index)
1298+ }
12951299 _ => bug ! ( ) ,
12961300 }
12971301 } ;
@@ -1567,22 +1571,22 @@ enum EnumDiscriminantInfo<'ll> {
15671571#[ derive( Copy , Clone ) ]
15681572enum VariantInfo < ' tcx > {
15691573 Adt ( & ' tcx ty:: VariantDef ) ,
1570- Generator ( ty:: GeneratorSubsts < ' tcx > , VariantIdx ) ,
1574+ Generator ( ty:: GeneratorSubsts < ' tcx > , & ' tcx GeneratorLayout < ' tcx > , VariantIdx ) ,
15711575}
15721576
15731577impl < ' tcx > VariantInfo < ' tcx > {
15741578 fn map_struct_name < R > ( & self , f : impl FnOnce ( & str ) -> R ) -> R {
15751579 match self {
15761580 VariantInfo :: Adt ( variant) => f ( & variant. ident . as_str ( ) ) ,
1577- VariantInfo :: Generator ( substs, variant_index) =>
1581+ VariantInfo :: Generator ( substs, _ , variant_index) =>
15781582 substs. map_variant_name ( * variant_index, f) ,
15791583 }
15801584 }
15811585
15821586 fn variant_name ( & self ) -> String {
15831587 match self {
15841588 VariantInfo :: Adt ( variant) => variant. ident . to_string ( ) ,
1585- VariantInfo :: Generator ( _, variant_index) => {
1589+ VariantInfo :: Generator ( _, _ , variant_index) => {
15861590 // Since GDB currently prints out the raw discriminant along
15871591 // with every variant, make each variant name be just the value
15881592 // of the discriminant. The struct name for the variant includes
@@ -1593,11 +1597,16 @@ impl<'tcx> VariantInfo<'tcx> {
15931597 }
15941598
15951599 fn field_name ( & self , i : usize ) -> String {
1596- match self {
1600+ let field_name = match self {
15971601 VariantInfo :: Adt ( variant) if variant. ctor_kind != CtorKind :: Fn =>
1598- variant. fields [ i] . ident . to_string ( ) ,
1599- _ => format ! ( "__{}" , i) ,
1600- }
1602+ Some ( variant. fields [ i] . ident . to_string ( ) ) ,
1603+ VariantInfo :: Generator ( _, generator_layout, variant_index) => {
1604+ let variant_decls = & generator_layout. variant_fields [ * variant_index] ;
1605+ variant_decls[ i] . name . map ( |name| name. to_string ( ) )
1606+ }
1607+ _ => None ,
1608+ } ;
1609+ field_name. unwrap_or_else ( || format ! ( "__{}" , i) )
16011610 }
16021611}
16031612
0 commit comments