@@ -23,6 +23,7 @@ use rustc::hir::def::CtorKind;
23
23
use rustc:: hir:: def_id:: { DefId , CrateNum , LOCAL_CRATE } ;
24
24
use rustc:: ich:: NodeIdHashingMode ;
25
25
use rustc:: mir:: Field ;
26
+ use rustc:: mir:: GeneratorLayout ;
26
27
use rustc:: mir:: interpret:: truncate;
27
28
use rustc_data_structures:: fingerprint:: Fingerprint ;
28
29
use rustc:: ty:: Instance ;
@@ -1291,7 +1292,10 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1291
1292
let variant_info_for = |index : VariantIdx | {
1292
1293
match & self . enum_type . sty {
1293
1294
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
+ }
1295
1299
_ => bug ! ( ) ,
1296
1300
}
1297
1301
} ;
@@ -1567,22 +1571,22 @@ enum EnumDiscriminantInfo<'ll> {
1567
1571
#[ derive( Copy , Clone ) ]
1568
1572
enum VariantInfo < ' tcx > {
1569
1573
Adt ( & ' tcx ty:: VariantDef ) ,
1570
- Generator ( ty:: GeneratorSubsts < ' tcx > , VariantIdx ) ,
1574
+ Generator ( ty:: GeneratorSubsts < ' tcx > , & ' tcx GeneratorLayout < ' tcx > , VariantIdx ) ,
1571
1575
}
1572
1576
1573
1577
impl < ' tcx > VariantInfo < ' tcx > {
1574
1578
fn map_struct_name < R > ( & self , f : impl FnOnce ( & str ) -> R ) -> R {
1575
1579
match self {
1576
1580
VariantInfo :: Adt ( variant) => f ( & variant. ident . as_str ( ) ) ,
1577
- VariantInfo :: Generator ( substs, variant_index) =>
1581
+ VariantInfo :: Generator ( substs, _ , variant_index) =>
1578
1582
substs. map_variant_name ( * variant_index, f) ,
1579
1583
}
1580
1584
}
1581
1585
1582
1586
fn variant_name ( & self ) -> String {
1583
1587
match self {
1584
1588
VariantInfo :: Adt ( variant) => variant. ident . to_string ( ) ,
1585
- VariantInfo :: Generator ( _, variant_index) => {
1589
+ VariantInfo :: Generator ( _, _ , variant_index) => {
1586
1590
// Since GDB currently prints out the raw discriminant along
1587
1591
// with every variant, make each variant name be just the value
1588
1592
// of the discriminant. The struct name for the variant includes
@@ -1593,11 +1597,16 @@ impl<'tcx> VariantInfo<'tcx> {
1593
1597
}
1594
1598
1595
1599
fn field_name ( & self , i : usize ) -> String {
1596
- match self {
1600
+ let field_name = match self {
1597
1601
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) )
1601
1610
}
1602
1611
}
1603
1612
0 commit comments