Skip to content

Commit a556370

Browse files
committed
mbe: Report attr rules using a MultiSpan
This avoids emitting a single span that includes both the argument matcher and body matcher.
1 parent e5460fe commit a556370

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

compiler/rustc_expand/src/mbe/macro_rules.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_ast::tokenstream::{self, DelimSpan, TokenStream};
1111
use rustc_ast::{self as ast, DUMMY_NODE_ID, NodeId};
1212
use rustc_ast_pretty::pprust;
1313
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
14-
use rustc_errors::{Applicability, Diag, ErrorGuaranteed};
14+
use rustc_errors::{Applicability, Diag, ErrorGuaranteed, MultiSpan};
1515
use rustc_feature::Features;
1616
use rustc_hir as hir;
1717
use 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

136142
pub struct MacroRulesMacroExpander {
@@ -142,11 +148,15 @@ pub struct MacroRulesMacroExpander {
142148
}
143149

144150
impl 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
}

tests/ui/macros/macro-rules-attr.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ warning: rule #3 of macro `local_attr` is never used
22
--> $DIR/macro-rules-attr.rs:43:9
33
|
44
LL | attr() {} => {
5-
| ^^^^^
5+
| ^^ ^^
66
|
77
note: the lint level is defined here
88
--> $DIR/macro-rules-attr.rs:4:9

0 commit comments

Comments
 (0)