Skip to content

Commit 769db2a

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 4c3a353 commit 769db2a

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
@@ -12,7 +12,7 @@ use rustc_ast::{self as ast, DUMMY_NODE_ID, NodeId};
1212
use rustc_ast_pretty::pprust;
1313
use rustc_attr_data_structures::{AttributeKind, find_attr};
1414
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
15-
use rustc_errors::{Applicability, Diag, ErrorGuaranteed};
15+
use rustc_errors::{Applicability, Diag, ErrorGuaranteed, MultiSpan};
1616
use rustc_feature::Features;
1717
use rustc_hir as hir;
1818
use rustc_lint_defs::BuiltinLintDiag;
@@ -129,7 +129,13 @@ pub(super) enum MacroRule {
129129
/// A function-style rule, for use with `m!()`
130130
Func { lhs: Vec<MatcherLoc>, lhs_span: Span, rhs: mbe::TokenTree },
131131
/// An attr rule, for use with `#[m]`
132-
Attr { args: Vec<MatcherLoc>, body: Vec<MatcherLoc>, lhs_span: Span, rhs: mbe::TokenTree },
132+
Attr {
133+
args: Vec<MatcherLoc>,
134+
args_span: Span,
135+
body: Vec<MatcherLoc>,
136+
body_span: Span,
137+
rhs: mbe::TokenTree,
138+
},
133139
}
134140

135141
pub struct MacroRulesMacroExpander {
@@ -141,11 +147,15 @@ pub struct MacroRulesMacroExpander {
141147
}
142148

143149
impl MacroRulesMacroExpander {
144-
pub fn get_unused_rule(&self, rule_i: usize) -> Option<(&Ident, Span)> {
150+
pub fn get_unused_rule(&self, rule_i: usize) -> Option<(&Ident, MultiSpan)> {
145151
// 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)) }
152+
let (span, rhs) = match self.rules[rule_i] {
153+
MacroRule::Func { lhs_span, ref rhs, .. } => (MultiSpan::from_span(lhs_span), rhs),
154+
MacroRule::Attr { args_span, body_span, ref rhs, .. } => {
155+
(MultiSpan::from_spans(vec![args_span, body_span]), rhs)
156+
}
157+
};
158+
if has_compile_error_macro(rhs) { None } else { Some((&self.name, span)) }
149159
}
150160
}
151161

@@ -594,12 +604,13 @@ pub fn compile_declarative_macro(
594604
return dummy_syn_ext(guar.unwrap());
595605
};
596606
if let Some(args) = args {
597-
let lhs_span = args.span().to(lhs_span);
607+
let args_span = args.span();
598608
let mbe::TokenTree::Delimited(.., delimited) = args else {
599609
return dummy_syn_ext(guar.unwrap());
600610
};
601611
let args = mbe::macro_parser::compute_locs(&delimited.tts);
602-
rules.push(MacroRule::Attr { args, body: lhs, lhs_span, rhs: rhs_tt });
612+
let body_span = lhs_span;
613+
rules.push(MacroRule::Attr { args, args_span, body: lhs, body_span, rhs: rhs_tt });
603614
} else {
604615
rules.push(MacroRule::Func { lhs, lhs_span, rhs: rhs_tt });
605616
}

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)