Skip to content

Commit ba2989f

Browse files
committed
fix duplicate diagnostics for msrv attrs
1 parent aca1147 commit ba2989f

5 files changed

Lines changed: 38 additions & 27 deletions

File tree

clippy_lints/src/attrs/mod.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -577,9 +577,8 @@ impl PostExpansionEarlyAttributes {
577577
}
578578

579579
impl EarlyLintPass for PostExpansionEarlyAttributes {
580-
fn check_crate(&mut self, cx: &EarlyContext<'_>, krate: &ast::Crate) {
580+
fn check_crate(&mut self, cx: &EarlyContext<'_>, _krate: &ast::Crate) {
581581
blanket_clippy_restriction_lints::check_command_line(cx);
582-
duplicated_attributes::check(cx, &krate.attrs);
583582
}
584583

585584
fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &Attribute) {
@@ -639,8 +638,15 @@ impl EarlyLintPass for PostExpansionEarlyAttributes {
639638
}
640639

641640
mixed_attributes_style::check(cx, item.span, &item.attrs);
642-
duplicated_attributes::check(cx, &item.attrs);
643641
}
644642

645-
extract_msrv_attr!();
643+
fn check_attributes(&mut self, cx: &EarlyContext<'_>, attrs: &[Attribute]) {
644+
self.msrv.check_attributes(attrs);
645+
duplicated_attributes::check(cx, attrs);
646+
msrvs::check_attrs(cx.sess(), attrs);
647+
}
648+
649+
fn check_attributes_post(&mut self, _cx: &EarlyContext<'_>, attrs: &[Attribute]) {
650+
self.msrv.check_attributes_post(attrs);
651+
}
646652
}

clippy_utils/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,12 @@ macro_rules! extract_msrv_attr {
134134
() => {
135135
fn check_attributes(&mut self, cx: &rustc_lint::EarlyContext<'_>, attrs: &[rustc_ast::ast::Attribute]) {
136136
let sess = rustc_lint::LintContext::sess(cx);
137-
self.msrv.check_attributes(sess, attrs);
137+
self.msrv.check_attributes(attrs);
138138
}
139139

140140
fn check_attributes_post(&mut self, cx: &rustc_lint::EarlyContext<'_>, attrs: &[rustc_ast::ast::Attribute]) {
141141
let sess = rustc_lint::LintContext::sess(cx);
142-
self.msrv.check_attributes_post(sess, attrs);
142+
self.msrv.check_attributes_post(attrs);
143143
}
144144
};
145145
}

clippy_utils/src/msrvs.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ impl Msrv {
140140
fn for_attrs(self, tcx: TyCtxt<'_>, node: HirId) -> Option<RustcVersion> {
141141
once(node)
142142
.chain(tcx.hir_parent_id_iter(node))
143-
.find_map(|id| parse_attrs(tcx.sess, tcx.hir_attrs(id)))
143+
.find_map(|id| parse_attrs(tcx.hir_attrs(id)))
144144
.or(self.0)
145145
}
146146

@@ -199,24 +199,34 @@ impl MsrvStack {
199199
self.current().is_none_or(|msrv| msrv >= required)
200200
}
201201

202-
pub fn check_attributes(&mut self, sess: &Session, attrs: &[Attribute]) {
203-
if let Some(version) = parse_attrs(sess, attrs) {
202+
pub fn check_attributes(&mut self, attrs: &[Attribute]) {
203+
if let Some(version) = parse_attrs(attrs) {
204204
SEEN_MSRV_ATTR.store(true, Ordering::Relaxed);
205205
self.stack.push(version);
206206
}
207207
}
208208

209-
pub fn check_attributes_post(&mut self, sess: &Session, attrs: &[Attribute]) {
210-
if parse_attrs(sess, attrs).is_some() {
209+
pub fn check_attributes_post(&mut self, attrs: &[Attribute]) {
210+
if parse_attrs(attrs).is_some() {
211211
self.stack.pop();
212212
}
213213
}
214214
}
215215

216-
fn parse_attrs(sess: &Session, attrs: &[impl AttributeExt]) -> Option<RustcVersion> {
216+
fn parse_attrs(attrs: &[impl AttributeExt]) -> Option<RustcVersion> {
217+
let msrv_attr = attrs.iter().find(|attr| attr.path_matches(&[sym::clippy, sym::msrv]))?;
218+
219+
let msrv = msrv_attr.value_str()?;
220+
221+
parse_version(msrv)
222+
}
223+
224+
pub fn check_attrs(sess: &Session, attrs: &[impl AttributeExt]) {
217225
let mut msrv_attrs = attrs.iter().filter(|attr| attr.path_matches(&[sym::clippy, sym::msrv]));
218226

219-
let msrv_attr = msrv_attrs.next()?;
227+
let Some(msrv_attr) = msrv_attrs.next() else {
228+
return;
229+
};
220230

221231
if let Some(duplicate) = msrv_attrs.next_back() {
222232
sess.dcx()
@@ -227,14 +237,11 @@ fn parse_attrs(sess: &Session, attrs: &[impl AttributeExt]) -> Option<RustcVersi
227237

228238
let Some(msrv) = msrv_attr.value_str() else {
229239
sess.dcx().span_err(msrv_attr.span(), "bad clippy attribute");
230-
return None;
240+
return;
231241
};
232242

233-
let Some(version) = parse_version(msrv) else {
243+
if parse_version(msrv).is_none() {
234244
sess.dcx()
235245
.span_err(msrv_attr.span(), format!("`{msrv}` is not a valid Rust version"));
236-
return None;
237-
};
238-
239-
Some(version)
246+
}
240247
}

tests/ui/min_rust_version_invalid_attr.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
//@compile-flags: -Zdeduplicate-diagnostics=yes
2-
31
#![feature(custom_inner_attributes)]
42
#![clippy::msrv = "invalid.version"]
53
//~^ ERROR: `invalid.version` is not a valid Rust version

tests/ui/min_rust_version_invalid_attr.stderr

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
error: `invalid.version` is not a valid Rust version
2-
--> tests/ui/min_rust_version_invalid_attr.rs:4:1
2+
--> tests/ui/min_rust_version_invalid_attr.rs:2:1
33
|
44
LL | #![clippy::msrv = "invalid.version"]
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66

77
error: `invalid.version` is not a valid Rust version
8-
--> tests/ui/min_rust_version_invalid_attr.rs:9:1
8+
--> tests/ui/min_rust_version_invalid_attr.rs:7:1
99
|
1010
LL | #[clippy::msrv = "invalid.version"]
1111
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1212

1313
error: `clippy::msrv` is defined multiple times
14-
--> tests/ui/min_rust_version_invalid_attr.rs:16:5
14+
--> tests/ui/min_rust_version_invalid_attr.rs:14:5
1515
|
1616
LL | #![clippy::msrv = "1.10.1"]
1717
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1818
|
1919
note: first definition found here
20-
--> tests/ui/min_rust_version_invalid_attr.rs:14:5
20+
--> tests/ui/min_rust_version_invalid_attr.rs:12:5
2121
|
2222
LL | #![clippy::msrv = "1.40"]
2323
| ^^^^^^^^^^^^^^^^^^^^^^^^^
2424

2525
error: `clippy::msrv` is defined multiple times
26-
--> tests/ui/min_rust_version_invalid_attr.rs:21:9
26+
--> tests/ui/min_rust_version_invalid_attr.rs:19:9
2727
|
2828
LL | #![clippy::msrv = "1.0.0"]
2929
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
3030
|
3131
note: first definition found here
32-
--> tests/ui/min_rust_version_invalid_attr.rs:20:9
32+
--> tests/ui/min_rust_version_invalid_attr.rs:18:9
3333
|
3434
LL | #![clippy::msrv = "1.0"]
3535
| ^^^^^^^^^^^^^^^^^^^^^^^^

0 commit comments

Comments
 (0)