@@ -729,7 +729,7 @@ pub struct Generics {
729
729
pub has_late_bound_regions : Option < Span > ,
730
730
}
731
731
732
- impl Generics {
732
+ impl < ' a , ' gcx , ' tcx > Generics {
733
733
pub fn parent_count ( & self ) -> usize {
734
734
self . parent_regions as usize + self . parent_types as usize
735
735
}
@@ -742,14 +742,28 @@ impl Generics {
742
742
self . parent_count ( ) + self . own_count ( )
743
743
}
744
744
745
- pub fn region_param ( & self , param : & EarlyBoundRegion ) -> & RegionParameterDef {
746
- assert_eq ! ( self . parent_count( ) , 0 ) ;
747
- & self . regions [ param. index as usize - self . has_self as usize ]
745
+ pub fn region_param ( & ' tcx self ,
746
+ param : & EarlyBoundRegion ,
747
+ tcx : TyCtxt < ' a , ' gcx , ' tcx > )
748
+ -> & ' tcx RegionParameterDef
749
+ {
750
+ if let Some ( index) = param. index . checked_sub ( self . parent_count ( ) as u32 ) {
751
+ & self . regions [ index as usize - self . has_self as usize ]
752
+ } else {
753
+ tcx. generics_of ( self . parent . expect ( "parent_count>0 but no parent?" ) )
754
+ . region_param ( param, tcx)
755
+ }
748
756
}
749
757
750
- pub fn type_param ( & self , param : & ParamTy ) -> & TypeParameterDef {
751
- assert_eq ! ( self . parent_count( ) , 0 ) ;
752
- & self . types [ param. idx as usize - self . has_self as usize - self . regions . len ( ) ]
758
+ pub fn type_param ( & ' tcx self ,
759
+ param : & ParamTy ,
760
+ tcx : TyCtxt < ' a , ' gcx , ' tcx > ) -> & TypeParameterDef {
761
+ if let Some ( idx) = param. idx . checked_sub ( self . parent_count ( ) as u32 ) {
762
+ & self . types [ idx as usize - self . has_self as usize - self . regions . len ( ) ]
763
+ } else {
764
+ tcx. generics_of ( self . parent . expect ( "parent_count>0 but no parent?" ) )
765
+ . type_param ( param, tcx)
766
+ }
753
767
}
754
768
}
755
769
0 commit comments