@@ -340,7 +340,9 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
340340
341341 fn record_macro_rule_usage ( & mut self , id : NodeId , rule_i : usize ) {
342342 let did = self . local_def_id ( id) ;
343- self . unused_macro_rules . remove ( & ( did, rule_i) ) ;
343+ if let Some ( rules) = self . unused_macro_rules . get_mut ( & did) {
344+ rules. remove ( & rule_i) ;
345+ }
344346 }
345347
346348 fn check_unused_macros ( & mut self ) {
@@ -352,18 +354,24 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
352354 BuiltinLintDiag :: UnusedMacroDefinition ( ident. name ) ,
353355 ) ;
354356 }
355- for ( & ( def_id, arm_i) , & ( ident, rule_span) ) in self . unused_macro_rules . iter ( ) {
356- if self . unused_macros . contains_key ( & def_id) {
357- // We already lint the entire macro as unused
358- continue ;
357+
358+ for ( & def_id, unused_arms) in self . unused_macro_rules . iter ( ) {
359+ let mut unused_arms = unused_arms. iter ( ) . collect :: < Vec < _ > > ( ) ;
360+ unused_arms. sort_by_key ( |& ( & arm_i, _) | arm_i) ;
361+
362+ for ( & arm_i, & ( ident, rule_span) ) in unused_arms {
363+ if self . unused_macros . contains_key ( & def_id) {
364+ // We already lint the entire macro as unused
365+ continue ;
366+ }
367+ let node_id = self . def_id_to_node_id [ def_id] ;
368+ self . lint_buffer . buffer_lint (
369+ UNUSED_MACRO_RULES ,
370+ node_id,
371+ rule_span,
372+ BuiltinLintDiag :: MacroRuleNeverUsed ( arm_i, ident. name ) ,
373+ ) ;
359374 }
360- let node_id = self . def_id_to_node_id [ def_id] ;
361- self . lint_buffer . buffer_lint (
362- UNUSED_MACRO_RULES ,
363- node_id,
364- rule_span,
365- BuiltinLintDiag :: MacroRuleNeverUsed ( arm_i, ident. name ) ,
366- ) ;
367375 }
368376 }
369377
0 commit comments