@@ -30,9 +30,8 @@ pub fn provide(providers: &mut Providers) {
30
30
/// Determine which generic parameters are used by the function/method/closure represented by
31
31
/// `def_id`. Returns a bitset where bits representing unused parameters are set (`is_empty`
32
32
/// indicates all parameters are used).
33
+ #[ instrument( skip( tcx) ) ]
33
34
fn unused_generic_params ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> FiniteBitSet < u32 > {
34
- debug ! ( "unused_generic_params({:?})" , def_id) ;
35
-
36
35
if !tcx. sess . opts . debugging_opts . polymorphize {
37
36
// If polymorphization disabled, then all parameters are used.
38
37
return FiniteBitSet :: new_empty ( ) ;
@@ -46,7 +45,7 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
46
45
}
47
46
48
47
let generics = tcx. generics_of ( def_id) ;
49
- debug ! ( "unused_generic_params: generics={:?}" , generics) ;
48
+ debug ! ( ? generics) ;
50
49
51
50
// Exit early when there are no parameters to be unused.
52
51
if generics. count ( ) == 0 {
@@ -57,11 +56,11 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
57
56
let context = tcx. hir ( ) . body_const_context ( def_id. expect_local ( ) ) ;
58
57
match context {
59
58
Some ( ConstContext :: ConstFn ) | None if !tcx. is_mir_available ( def_id) => {
60
- debug ! ( "unused_generic_params: ( no mir available) def_id={:?}" , def_id ) ;
59
+ debug ! ( "no mir available" ) ;
61
60
return FiniteBitSet :: new_empty ( ) ;
62
61
}
63
62
Some ( _) if !tcx. is_ctfe_mir_available ( def_id) => {
64
- debug ! ( "unused_generic_params: ( no ctfe mir available) def_id={:?}" , def_id ) ;
63
+ debug ! ( "no ctfe mir available" ) ;
65
64
return FiniteBitSet :: new_empty ( ) ;
66
65
}
67
66
_ => { }
@@ -72,9 +71,9 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
72
71
generics. count ( ) . try_into ( ) . expect ( "more generic parameters than can fit into a `u32`" ) ;
73
72
let mut unused_parameters = FiniteBitSet :: < u32 > :: new_empty ( ) ;
74
73
unused_parameters. set_range ( 0 ..generics_count) ;
75
- debug ! ( "unused_generic_params: (start) unused_parameters={:?}" , unused_parameters ) ;
74
+ debug ! ( ?unused_parameters , " (start)" ) ;
76
75
mark_used_by_default_parameters ( tcx, def_id, generics, & mut unused_parameters) ;
77
- debug ! ( "unused_generic_params: (after default) unused_parameters={:?}" , unused_parameters ) ;
76
+ debug ! ( ?unused_parameters , " (after default)" ) ;
78
77
79
78
// Visit MIR and accumululate used generic parameters.
80
79
let body = match context {
@@ -85,10 +84,10 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
85
84
} ;
86
85
let mut vis = MarkUsedGenericParams { tcx, def_id, unused_parameters : & mut unused_parameters } ;
87
86
vis. visit_body ( body) ;
88
- debug ! ( "unused_generic_params: (after visitor) unused_parameters={:?}" , unused_parameters ) ;
87
+ debug ! ( ?unused_parameters , " (after visitor)" ) ;
89
88
90
89
mark_used_by_predicates ( tcx, def_id, & mut unused_parameters) ;
91
- debug ! ( "unused_generic_params: (end) unused_parameters={:?}" , unused_parameters ) ;
90
+ debug ! ( ?unused_parameters , " (end)" ) ;
92
91
93
92
// Emit errors for debugging and testing if enabled.
94
93
if !unused_parameters. is_empty ( ) {
@@ -101,24 +100,55 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
101
100
/// Some parameters are considered used-by-default, such as non-generic parameters and the dummy
102
101
/// generic parameters from closures, this function marks them as used. `leaf_is_closure` should
103
102
/// be `true` if the item that `unused_generic_params` was invoked on is a closure.
103
+ #[ instrument( skip( tcx, def_id, generics, unused_parameters) ) ]
104
104
fn mark_used_by_default_parameters < ' tcx > (
105
105
tcx : TyCtxt < ' tcx > ,
106
106
def_id : DefId ,
107
107
generics : & ' tcx ty:: Generics ,
108
108
unused_parameters : & mut FiniteBitSet < u32 > ,
109
109
) {
110
- if !tcx. is_trait ( def_id) && ( tcx. is_closure ( def_id) || tcx. type_of ( def_id) . is_generator ( ) ) {
111
- for param in & generics. params {
112
- debug ! ( "mark_used_by_default_parameters: (closure/gen) param={:?}" , param) ;
113
- unused_parameters. clear ( param. index ) ;
114
- }
115
- } else {
116
- for param in & generics. params {
117
- debug ! ( "mark_used_by_default_parameters: (other) param={:?}" , param) ;
118
- if let ty:: GenericParamDefKind :: Lifetime = param. kind {
110
+ match tcx. def_kind ( def_id) {
111
+ DefKind :: Closure | DefKind :: Generator => {
112
+ for param in & generics. params {
113
+ debug ! ( ?param, "(closure/gen)" ) ;
119
114
unused_parameters. clear ( param. index ) ;
120
115
}
121
116
}
117
+ DefKind :: Mod
118
+ | DefKind :: Struct
119
+ | DefKind :: Union
120
+ | DefKind :: Enum
121
+ | DefKind :: Variant
122
+ | DefKind :: Trait
123
+ | DefKind :: TyAlias
124
+ | DefKind :: ForeignTy
125
+ | DefKind :: TraitAlias
126
+ | DefKind :: AssocTy
127
+ | DefKind :: TyParam
128
+ | DefKind :: Fn
129
+ | DefKind :: Const
130
+ | DefKind :: ConstParam
131
+ | DefKind :: Static
132
+ | DefKind :: Ctor ( _, _)
133
+ | DefKind :: AssocFn
134
+ | DefKind :: AssocConst
135
+ | DefKind :: Macro ( _)
136
+ | DefKind :: ExternCrate
137
+ | DefKind :: Use
138
+ | DefKind :: ForeignMod
139
+ | DefKind :: AnonConst
140
+ | DefKind :: OpaqueTy
141
+ | DefKind :: Field
142
+ | DefKind :: LifetimeParam
143
+ | DefKind :: GlobalAsm
144
+ | DefKind :: Impl => {
145
+ for param in & generics. params {
146
+ debug ! ( ?param, "(other)" ) ;
147
+ if let ty:: GenericParamDefKind :: Lifetime = param. kind {
148
+ unused_parameters. clear ( param. index ) ;
149
+ }
150
+ }
151
+ }
122
152
}
123
153
124
154
if let Some ( parent) = generics. parent {
@@ -128,23 +158,20 @@ fn mark_used_by_default_parameters<'tcx>(
128
158
129
159
/// Search the predicates on used generic parameters for any unused generic parameters, and mark
130
160
/// those as used.
161
+ #[ instrument( skip( tcx, def_id) ) ]
131
162
fn mark_used_by_predicates < ' tcx > (
132
163
tcx : TyCtxt < ' tcx > ,
133
164
def_id : DefId ,
134
165
unused_parameters : & mut FiniteBitSet < u32 > ,
135
166
) {
136
167
let def_id = tcx. closure_base_def_id ( def_id) ;
137
168
let predicates = tcx. explicit_predicates_of ( def_id) ;
138
- debug ! ( "mark_used_by_predicates: predicates_of={:?}" , predicates) ;
139
169
140
170
let mut current_unused_parameters = FiniteBitSet :: new_empty ( ) ;
141
171
// Run to a fixed point to support `where T: Trait<U>, U: Trait<V>`, starting with an empty
142
172
// bit set so that this is skipped if all parameters are already used.
143
173
while current_unused_parameters != * unused_parameters {
144
- debug ! (
145
- "mark_used_by_predicates: current_unused_parameters={:?} = unused_parameters={:?}" ,
146
- current_unused_parameters, unused_parameters
147
- ) ;
174
+ debug ! ( ?current_unused_parameters, ?unused_parameters) ;
148
175
current_unused_parameters = * unused_parameters;
149
176
150
177
for ( predicate, _) in predicates. predicates {
@@ -169,13 +196,13 @@ fn mark_used_by_predicates<'tcx>(
169
196
170
197
/// Emit errors for the function annotated by `#[rustc_polymorphize_error]`, labelling each generic
171
198
/// parameter which was unused.
199
+ #[ instrument( skip( tcx, generics) ) ]
172
200
fn emit_unused_generic_params_error < ' tcx > (
173
201
tcx : TyCtxt < ' tcx > ,
174
202
def_id : DefId ,
175
203
generics : & ' tcx ty:: Generics ,
176
204
unused_parameters : & FiniteBitSet < u32 > ,
177
205
) {
178
- debug ! ( "emit_unused_generic_params_error: def_id={:?}" , def_id) ;
179
206
let base_def_id = tcx. closure_base_def_id ( def_id) ;
180
207
if !tcx
181
208
. get_attrs ( base_def_id)
@@ -185,7 +212,6 @@ fn emit_unused_generic_params_error<'tcx>(
185
212
return ;
186
213
}
187
214
188
- debug ! ( "emit_unused_generic_params_error: unused_parameters={:?}" , unused_parameters) ;
189
215
let fn_span = match tcx. opt_item_name ( def_id) {
190
216
Some ( ident) => ident. span ,
191
217
_ => tcx. def_span ( def_id) ,
@@ -197,7 +223,7 @@ fn emit_unused_generic_params_error<'tcx>(
197
223
while let Some ( generics) = next_generics {
198
224
for param in & generics. params {
199
225
if unused_parameters. contains ( param. index ) . unwrap_or ( false ) {
200
- debug ! ( "emit_unused_generic_params_error: param={:?}" , param) ;
226
+ debug ! ( ? param) ;
201
227
let def_span = tcx. def_span ( param. def_id ) ;
202
228
err. span_label ( def_span, & format ! ( "generic parameter `{}` is unused" , param. name) ) ;
203
229
}
@@ -219,33 +245,31 @@ struct MarkUsedGenericParams<'a, 'tcx> {
219
245
impl < ' a , ' tcx > MarkUsedGenericParams < ' a , ' tcx > {
220
246
/// Invoke `unused_generic_params` on a body contained within the current item (e.g.
221
247
/// a closure, generator or constant).
248
+ #[ instrument( skip( self , def_id, substs) ) ]
222
249
fn visit_child_body ( & mut self , def_id : DefId , substs : SubstsRef < ' tcx > ) {
223
250
let unused = self . tcx . unused_generic_params ( def_id) ;
224
- debug ! (
225
- "visit_child_body: unused_parameters={:?} unused={:?}" ,
226
- self . unused_parameters, unused
227
- ) ;
251
+ debug ! ( ?self . unused_parameters, ?unused) ;
228
252
for ( i, arg) in substs. iter ( ) . enumerate ( ) {
229
253
let i = i. try_into ( ) . unwrap ( ) ;
230
254
if !unused. contains ( i) . unwrap_or ( false ) {
231
255
arg. visit_with ( self ) ;
232
256
}
233
257
}
234
- debug ! ( "visit_child_body: unused_parameters={:?}" , self . unused_parameters) ;
258
+ debug ! ( ? self . unused_parameters) ;
235
259
}
236
260
}
237
261
238
262
impl < ' a , ' tcx > Visitor < ' tcx > for MarkUsedGenericParams < ' a , ' tcx > {
263
+ #[ instrument( skip( self , local) ) ]
239
264
fn visit_local_decl ( & mut self , local : Local , local_decl : & LocalDecl < ' tcx > ) {
240
- debug ! ( "visit_local_decl: local_decl={:?}" , local_decl) ;
241
265
if local == Local :: from_usize ( 1 ) {
242
266
let def_kind = self . tcx . def_kind ( self . def_id ) ;
243
267
if matches ! ( def_kind, DefKind :: Closure | DefKind :: Generator ) {
244
268
// Skip visiting the closure/generator that is currently being processed. This only
245
269
// happens because the first argument to the closure is a reference to itself and
246
270
// that will call `visit_substs`, resulting in each generic parameter captured being
247
271
// considered used by default.
248
- debug ! ( "visit_local_decl: skipping closure substs" ) ;
272
+ debug ! ( "skipping closure substs" ) ;
249
273
return ;
250
274
}
251
275
}
@@ -263,15 +287,15 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> {
263
287
}
264
288
265
289
impl < ' a , ' tcx > TypeVisitor < ' tcx > for MarkUsedGenericParams < ' a , ' tcx > {
290
+ #[ instrument( skip( self ) ) ]
266
291
fn visit_const ( & mut self , c : & ' tcx Const < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
267
- debug ! ( "visit_const: c={:?}" , c) ;
268
292
if !c. has_param_types_or_consts ( ) {
269
293
return ControlFlow :: CONTINUE ;
270
294
}
271
295
272
296
match c. val {
273
297
ty:: ConstKind :: Param ( param) => {
274
- debug ! ( "visit_const: param={:?}" , param) ;
298
+ debug ! ( ? param) ;
275
299
self . unused_parameters . clear ( param. index ) ;
276
300
ControlFlow :: CONTINUE
277
301
}
@@ -296,15 +320,15 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> {
296
320
}
297
321
}
298
322
323
+ #[ instrument( skip( self ) ) ]
299
324
fn visit_ty ( & mut self , ty : Ty < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
300
- debug ! ( "visit_ty: ty={:?}" , ty) ;
301
325
if !ty. has_param_types_or_consts ( ) {
302
326
return ControlFlow :: CONTINUE ;
303
327
}
304
328
305
329
match * ty. kind ( ) {
306
330
ty:: Closure ( def_id, substs) | ty:: Generator ( def_id, substs, ..) => {
307
- debug ! ( "visit_ty: def_id={:?}" , def_id) ;
331
+ debug ! ( ? def_id) ;
308
332
// Avoid cycle errors with generators.
309
333
if def_id == self . def_id {
310
334
return ControlFlow :: CONTINUE ;
@@ -316,7 +340,7 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> {
316
340
ControlFlow :: CONTINUE
317
341
}
318
342
ty:: Param ( param) => {
319
- debug ! ( "visit_ty: param={:?}" , param) ;
343
+ debug ! ( ? param) ;
320
344
self . unused_parameters . clear ( param. index ) ;
321
345
ControlFlow :: CONTINUE
322
346
}
@@ -333,8 +357,8 @@ struct HasUsedGenericParams<'a> {
333
357
impl < ' a , ' tcx > TypeVisitor < ' tcx > for HasUsedGenericParams < ' a > {
334
358
type BreakTy = ( ) ;
335
359
360
+ #[ instrument( skip( self ) ) ]
336
361
fn visit_const ( & mut self , c : & ' tcx Const < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
337
- debug ! ( "visit_const: c={:?}" , c) ;
338
362
if !c. has_param_types_or_consts ( ) {
339
363
return ControlFlow :: CONTINUE ;
340
364
}
@@ -351,8 +375,8 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for HasUsedGenericParams<'a> {
351
375
}
352
376
}
353
377
378
+ #[ instrument( skip( self ) ) ]
354
379
fn visit_ty ( & mut self , ty : Ty < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
355
- debug ! ( "visit_ty: ty={:?}" , ty) ;
356
380
if !ty. has_param_types_or_consts ( ) {
357
381
return ControlFlow :: CONTINUE ;
358
382
}
0 commit comments