@@ -12,6 +12,7 @@ use rustc_ast::{self as ast, DUMMY_NODE_ID, NodeId};
1212use rustc_ast_pretty:: pprust;
1313use rustc_attr_data_structures:: { AttributeKind , find_attr} ;
1414use rustc_data_structures:: fx:: { FxHashMap , FxIndexMap } ;
15+ use rustc_error_messages:: MultiSpan ;
1516use rustc_errors:: { Applicability , Diag , ErrorGuaranteed } ;
1617use rustc_feature:: Features ;
1718use rustc_hir as hir;
@@ -129,7 +130,13 @@ pub(super) enum MacroRule {
129130 /// A function-style rule, for use with `m!()`
130131 Func { lhs : Vec < MatcherLoc > , lhs_span : Span , rhs : mbe:: TokenTree } ,
131132 /// An attr rule, for use with `#[m]`
132- Attr { args : Vec < MatcherLoc > , body : Vec < MatcherLoc > , lhs_span : Span , rhs : mbe:: TokenTree } ,
133+ Attr {
134+ args : Vec < MatcherLoc > ,
135+ args_span : Span ,
136+ body : Vec < MatcherLoc > ,
137+ body_span : Span ,
138+ rhs : mbe:: TokenTree ,
139+ } ,
133140}
134141
135142pub struct MacroRulesMacroExpander {
@@ -141,11 +148,15 @@ pub struct MacroRulesMacroExpander {
141148}
142149
143150impl MacroRulesMacroExpander {
144- pub fn get_unused_rule ( & self , rule_i : usize ) -> Option < ( & Ident , Span ) > {
151+ pub fn get_unused_rule ( & self , rule_i : usize ) -> Option < ( & Ident , MultiSpan ) > {
145152 // If the rhs contains an invocation like `compile_error!`, don't report it as unused.
146- let ( MacroRule :: Func { lhs_span, ref rhs, .. } | MacroRule :: Attr { lhs_span, ref rhs, .. } ) =
147- self . rules [ rule_i] ;
148- if has_compile_error_macro ( rhs) { None } else { Some ( ( & self . name , lhs_span) ) }
153+ let ( span, rhs) = match self . rules [ rule_i] {
154+ MacroRule :: Func { lhs_span, ref rhs, .. } => ( MultiSpan :: from_span ( lhs_span) , rhs) ,
155+ MacroRule :: Attr { args_span, body_span, ref rhs, .. } => {
156+ ( MultiSpan :: from_spans ( vec ! [ args_span, body_span] ) , rhs)
157+ }
158+ } ;
159+ if has_compile_error_macro ( rhs) { None } else { Some ( ( & self . name , span) ) }
149160 }
150161}
151162
@@ -594,12 +605,13 @@ pub fn compile_declarative_macro(
594605 return dummy_syn_ext ( guar. unwrap ( ) ) ;
595606 } ;
596607 if let Some ( args) = args {
597- let lhs_span = args. span ( ) . to ( lhs_span ) ;
608+ let args_span = args. span ( ) ;
598609 let mbe:: TokenTree :: Delimited ( .., delimited) = args else {
599610 return dummy_syn_ext ( guar. unwrap ( ) ) ;
600611 } ;
601612 let args = mbe:: macro_parser:: compute_locs ( & delimited. tts ) ;
602- rules. push ( MacroRule :: Attr { args, body : lhs, lhs_span, rhs : rhs_tt } ) ;
613+ let body_span = lhs_span;
614+ rules. push ( MacroRule :: Attr { args, args_span, body : lhs, body_span, rhs : rhs_tt } ) ;
603615 } else {
604616 rules. push ( MacroRule :: Func { lhs, lhs_span, rhs : rhs_tt } ) ;
605617 }
0 commit comments