@@ -349,11 +349,26 @@ pub(super) fn late_lint_mod<'tcx, T: LateLintPass<'tcx> + 'tcx>(
349349 only_module : true ,
350350 } ;
351351
352+ // Note: `passes` is often empty. In that case, it's faster to run
353+ // `builtin_lints` directly rather than bundling it up into the
354+ // `RuntimeCombinedLateLintPass`.
352355 let mut passes: Vec < _ > =
353356 unerased_lint_store ( tcx) . late_module_passes . iter ( ) . map ( |mk_pass| ( mk_pass) ( tcx) ) . collect ( ) ;
354- passes. push ( Box :: new ( builtin_lints) ) ;
355- let pass = RuntimeCombinedLateLintPass { passes : & mut passes[ ..] } ;
357+ if passes. is_empty ( ) {
358+ late_lint_mod_inner ( tcx, module_def_id, context, builtin_lints) ;
359+ } else {
360+ passes. push ( Box :: new ( builtin_lints) ) ;
361+ let pass = RuntimeCombinedLateLintPass { passes : & mut passes[ ..] } ;
362+ late_lint_mod_inner ( tcx, module_def_id, context, pass) ;
363+ }
364+ }
356365
366+ fn late_lint_mod_inner < ' tcx , T : LateLintPass < ' tcx > > (
367+ tcx : TyCtxt < ' tcx > ,
368+ module_def_id : LocalDefId ,
369+ context : LateContext < ' tcx > ,
370+ pass : T ,
371+ ) {
357372 let mut cx = LateContextAndPass { context, pass } ;
358373
359374 let ( module, _span, hir_id) = tcx. hir ( ) . get_module ( module_def_id) ;
@@ -380,11 +395,25 @@ fn late_lint_crate<'tcx, T: LateLintPass<'tcx> + 'tcx>(tcx: TyCtxt<'tcx>, builti
380395 only_module : false ,
381396 } ;
382397
398+ // Note: `passes` is often empty. In that case, it's faster to run
399+ // `builtin_lints` directly rather than bundling it up into the
400+ // `RuntimeCombinedLateLintPass`.
383401 let mut passes: Vec < _ > =
384402 unerased_lint_store ( tcx) . late_passes . iter ( ) . map ( |mk_pass| ( mk_pass) ( tcx) ) . collect ( ) ;
385- passes. push ( Box :: new ( builtin_lints) ) ;
386- let pass = RuntimeCombinedLateLintPass { passes : & mut passes[ ..] } ;
403+ if passes. is_empty ( ) {
404+ late_lint_crate_inner ( tcx, context, builtin_lints) ;
405+ } else {
406+ passes. push ( Box :: new ( builtin_lints) ) ;
407+ let pass = RuntimeCombinedLateLintPass { passes : & mut passes[ ..] } ;
408+ late_lint_crate_inner ( tcx, context, pass) ;
409+ }
410+ }
387411
412+ fn late_lint_crate_inner < ' tcx , T : LateLintPass < ' tcx > > (
413+ tcx : TyCtxt < ' tcx > ,
414+ context : LateContext < ' tcx > ,
415+ pass : T ,
416+ ) {
388417 let mut cx = LateContextAndPass { context, pass } ;
389418
390419 // Visit the whole crate.
0 commit comments