@@ -11,7 +11,7 @@ use rustc_ast::tokenstream::{self, DelimSpan, TokenStream};
1111use rustc_ast:: { self as ast, DUMMY_NODE_ID , NodeId } ;
1212use rustc_ast_pretty:: pprust;
1313use rustc_data_structures:: fx:: { FxHashMap , FxIndexMap } ;
14- use rustc_errors:: { Applicability , Diag , ErrorGuaranteed } ;
14+ use rustc_errors:: { Applicability , Diag , ErrorGuaranteed , MultiSpan } ;
1515use rustc_feature:: Features ;
1616use rustc_hir as hir;
1717use rustc_hir:: attrs:: AttributeKind ;
@@ -130,7 +130,13 @@ pub(super) enum MacroRule {
130130 /// A function-style rule, for use with `m!()`
131131 Func { lhs : Vec < MatcherLoc > , lhs_span : Span , rhs : mbe:: TokenTree } ,
132132 /// An attr rule, for use with `#[m]`
133- 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+ } ,
134140}
135141
136142pub struct MacroRulesMacroExpander {
@@ -142,11 +148,15 @@ pub struct MacroRulesMacroExpander {
142148}
143149
144150impl MacroRulesMacroExpander {
145- 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 ) > {
146152 // If the rhs contains an invocation like `compile_error!`, don't report it as unused.
147- let ( MacroRule :: Func { lhs_span, ref rhs, .. } | MacroRule :: Attr { lhs_span, ref rhs, .. } ) =
148- self . rules [ rule_i] ;
149- 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) ) }
150160 }
151161}
152162
@@ -595,12 +605,13 @@ pub fn compile_declarative_macro(
595605 return dummy_syn_ext ( guar. unwrap ( ) ) ;
596606 } ;
597607 if let Some ( args) = args {
598- let lhs_span = args. span ( ) . to ( lhs_span ) ;
608+ let args_span = args. span ( ) ;
599609 let mbe:: TokenTree :: Delimited ( .., delimited) = args else {
600610 return dummy_syn_ext ( guar. unwrap ( ) ) ;
601611 } ;
602612 let args = mbe:: macro_parser:: compute_locs ( & delimited. tts ) ;
603- 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 } ) ;
604615 } else {
605616 rules. push ( MacroRule :: Func { lhs, lhs_span, rhs : rhs_tt } ) ;
606617 }
0 commit comments