@@ -28,14 +28,21 @@ pub fn provide(providers: &mut Providers) {
2828/// Determine which generic parameters are used by the function/method/closure represented by
2929/// `def_id`. Returns a bitset where bits representing unused parameters are set (`is_empty`
3030/// indicates all parameters are used).
31- fn unused_generic_params ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> FiniteBitSet < u64 > {
31+ fn unused_generic_params ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> FiniteBitSet < u32 > {
3232 debug ! ( "unused_generic_params({:?})" , def_id) ;
3333
3434 if !tcx. sess . opts . debugging_opts . polymorphize {
3535 // If polymorphization disabled, then all parameters are used.
3636 return FiniteBitSet :: new_empty ( ) ;
3737 }
3838
39+ // Polymorphization results are stored in cross-crate metadata only when there are unused
40+ // parameters, so assume that non-local items must have only used parameters (else this query
41+ // would not be invoked, and the cross-crate metadata used instead).
42+ if !def_id. is_local ( ) {
43+ return FiniteBitSet :: new_empty ( ) ;
44+ }
45+
3946 let generics = tcx. generics_of ( def_id) ;
4047 debug ! ( "unused_generic_params: generics={:?}" , generics) ;
4148
@@ -53,7 +60,7 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u64> {
5360 // Create a bitset with N rightmost ones for each parameter.
5461 let generics_count: u32 =
5562 generics. count ( ) . try_into ( ) . expect ( "more generic parameters than can fit into a `u32`" ) ;
56- let mut unused_parameters = FiniteBitSet :: < u64 > :: new_empty ( ) ;
63+ let mut unused_parameters = FiniteBitSet :: < u32 > :: new_empty ( ) ;
5764 unused_parameters. set_range ( 0 ..generics_count) ;
5865 debug ! ( "unused_generic_params: (start) unused_parameters={:?}" , unused_parameters) ;
5966 mark_used_by_default_parameters ( tcx, def_id, generics, & mut unused_parameters) ;
@@ -84,7 +91,7 @@ fn mark_used_by_default_parameters<'tcx>(
8491 tcx : TyCtxt < ' tcx > ,
8592 def_id : DefId ,
8693 generics : & ' tcx ty:: Generics ,
87- unused_parameters : & mut FiniteBitSet < u64 > ,
94+ unused_parameters : & mut FiniteBitSet < u32 > ,
8895) {
8996 if !tcx. is_trait ( def_id) && ( tcx. is_closure ( def_id) || tcx. type_of ( def_id) . is_generator ( ) ) {
9097 for param in & generics. params {
@@ -110,11 +117,11 @@ fn mark_used_by_default_parameters<'tcx>(
110117fn mark_used_by_predicates < ' tcx > (
111118 tcx : TyCtxt < ' tcx > ,
112119 def_id : DefId ,
113- unused_parameters : & mut FiniteBitSet < u64 > ,
120+ unused_parameters : & mut FiniteBitSet < u32 > ,
114121) {
115122 let def_id = tcx. closure_base_def_id ( def_id) ;
116123
117- let is_self_ty_used = |unused_parameters : & mut FiniteBitSet < u64 > , self_ty : Ty < ' tcx > | {
124+ let is_self_ty_used = |unused_parameters : & mut FiniteBitSet < u32 > , self_ty : Ty < ' tcx > | {
118125 debug ! ( "unused_generic_params: self_ty={:?}" , self_ty) ;
119126 if let ty:: Param ( param) = self_ty. kind {
120127 !unused_parameters. contains ( param. index ) . unwrap_or ( false )
@@ -123,7 +130,7 @@ fn mark_used_by_predicates<'tcx>(
123130 }
124131 } ;
125132
126- let mark_ty = |unused_parameters : & mut FiniteBitSet < u64 > , ty : Ty < ' tcx > | {
133+ let mark_ty = |unused_parameters : & mut FiniteBitSet < u32 > , ty : Ty < ' tcx > | {
127134 let mut vis = UsedGenericParametersVisitor { tcx, def_id, unused_parameters } ;
128135 ty. visit_with ( & mut vis) ;
129136 } ;
@@ -159,7 +166,7 @@ fn emit_unused_generic_params_error<'tcx>(
159166 tcx : TyCtxt < ' tcx > ,
160167 def_id : DefId ,
161168 generics : & ' tcx ty:: Generics ,
162- unused_parameters : & FiniteBitSet < u64 > ,
169+ unused_parameters : & FiniteBitSet < u32 > ,
163170) {
164171 debug ! ( "emit_unused_generic_params_error: def_id={:?}" , def_id) ;
165172 let base_def_id = tcx. closure_base_def_id ( def_id) ;
@@ -195,7 +202,7 @@ fn emit_unused_generic_params_error<'tcx>(
195202struct UsedGenericParametersVisitor < ' a , ' tcx > {
196203 tcx : TyCtxt < ' tcx > ,
197204 def_id : DefId ,
198- unused_parameters : & ' a mut FiniteBitSet < u64 > ,
205+ unused_parameters : & ' a mut FiniteBitSet < u32 > ,
199206}
200207
201208impl < ' a , ' tcx > Visitor < ' tcx > for UsedGenericParametersVisitor < ' a , ' tcx > {
0 commit comments