Skip to content

Commit ef99041

Browse files
committed
Auto merge of #9860 - Alexendoo:msrv-outer-attr, r=Jarcho
Allow using `clippy::msrv` as an outer attribute changelog: Allow specifying `#[clippy::msrv]` as an outer attribute Probably not too useful to clippy users, but it makes the MSRV tests slightly cleaner
2 parents 030b4b7 + 461e219 commit ef99041

File tree

112 files changed

+799
-979
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+799
-979
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ in the `Cargo.toml` can be used.
224224
rust-version = "1.30"
225225
```
226226

227-
The MSRV can also be specified as an inner attribute, like below.
227+
The MSRV can also be specified as an attribute, like below.
228228

229229
```rust
230230
#![feature(custom_inner_attributes)]

book/src/configuration.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ minimum supported Rust version (MSRV) in the clippy configuration file.
7272
msrv = "1.30.0"
7373
```
7474

75-
The MSRV can also be specified as an inner attribute, like below.
75+
The MSRV can also be specified as an attribute, like below.
7676

7777
```rust
7878
#![feature(custom_inner_attributes)]

book/src/development/adding_lints.md

+3-7
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ if !self.msrv.meets(msrvs::STR_STRIP_PREFIX) {
463463
}
464464
```
465465

466-
The project's MSRV can also be specified as an inner attribute, which overrides
466+
The project's MSRV can also be specified as an attribute, which overrides
467467
the value from `clippy.toml`. This can be accounted for using the
468468
`extract_msrv_attr!(LintContext)` macro and passing
469469
`LateContext`/`EarlyContext`.
@@ -483,19 +483,15 @@ have a case for the version below the MSRV and one with the same contents but
483483
for the MSRV version itself.
484484

485485
```rust
486-
#![feature(custom_inner_attributes)]
487-
488486
...
489487

488+
#[clippy::msrv = "1.44"]
490489
fn msrv_1_44() {
491-
#![clippy::msrv = "1.44"]
492-
493490
/* something that would trigger the lint */
494491
}
495492

493+
#[clippy::msrv = "1.45"]
496494
fn msrv_1_45() {
497-
#![clippy::msrv = "1.45"]
498-
499495
/* something that would trigger the lint */
500496
}
501497
```

clippy_utils/src/attrs.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,19 @@ fn parse_attrs<F: FnMut(u64)>(sess: &Session, attrs: &[ast::Attribute], name: &'
125125
}
126126
}
127127

128-
pub fn get_unique_inner_attr(sess: &Session, attrs: &[ast::Attribute], name: &'static str) -> Option<ast::Attribute> {
129-
let mut unique_attr = None;
128+
pub fn get_unique_attr<'a>(
129+
sess: &'a Session,
130+
attrs: &'a [ast::Attribute],
131+
name: &'static str,
132+
) -> Option<&'a ast::Attribute> {
133+
let mut unique_attr: Option<&ast::Attribute> = None;
130134
for attr in get_attr(sess, attrs, name) {
131-
match attr.style {
132-
ast::AttrStyle::Inner if unique_attr.is_none() => unique_attr = Some(attr.clone()),
133-
ast::AttrStyle::Inner => {
134-
sess.struct_span_err(attr.span, &format!("`{name}` is defined multiple times"))
135-
.span_note(unique_attr.as_ref().unwrap().span, "first definition found here")
136-
.emit();
137-
},
138-
ast::AttrStyle::Outer => {
139-
sess.span_err(attr.span, format!("`{name}` cannot be an outer attribute"));
140-
},
135+
if let Some(duplicate) = unique_attr {
136+
sess.struct_span_err(attr.span, &format!("`{name}` is defined multiple times"))
137+
.span_note(duplicate.span, "first definition found here")
138+
.emit();
139+
} else {
140+
unique_attr = Some(attr);
141141
}
142142
}
143143
unique_attr

clippy_utils/src/msrvs.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_semver::RustcVersion;
55
use rustc_session::Session;
66
use rustc_span::Span;
77

8-
use crate::attrs::get_unique_inner_attr;
8+
use crate::attrs::get_unique_attr;
99

1010
macro_rules! msrv_aliases {
1111
($($major:literal,$minor:literal,$patch:literal {
@@ -118,7 +118,7 @@ impl Msrv {
118118
}
119119

120120
fn parse_attr(sess: &Session, attrs: &[Attribute]) -> Option<RustcVersion> {
121-
if let Some(msrv_attr) = get_unique_inner_attr(sess, attrs, "msrv") {
121+
if let Some(msrv_attr) = get_unique_attr(sess, attrs, "msrv") {
122122
if let Some(msrv) = msrv_attr.value_str() {
123123
return parse_msrv(&msrv.to_string(), Some(sess), Some(msrv_attr.span));
124124
}

tests/ui/almost_complete_letter_range.fixed

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// edition:2018
33
// aux-build:macro_rules.rs
44

5-
#![feature(custom_inner_attributes)]
65
#![feature(exclusive_range_pattern)]
76
#![feature(stmt_expr_attributes)]
87
#![warn(clippy::almost_complete_letter_range)]
@@ -62,16 +61,16 @@ fn main() {
6261
b!();
6362
}
6463

64+
#[clippy::msrv = "1.25"]
6565
fn _under_msrv() {
66-
#![clippy::msrv = "1.25"]
6766
let _ = match 'a' {
6867
'a'...'z' => 1,
6968
_ => 2,
7069
};
7170
}
7271

72+
#[clippy::msrv = "1.26"]
7373
fn _meets_msrv() {
74-
#![clippy::msrv = "1.26"]
7574
let _ = 'a'..='z';
7675
let _ = match 'a' {
7776
'a'..='z' => 1,

tests/ui/almost_complete_letter_range.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// edition:2018
33
// aux-build:macro_rules.rs
44

5-
#![feature(custom_inner_attributes)]
65
#![feature(exclusive_range_pattern)]
76
#![feature(stmt_expr_attributes)]
87
#![warn(clippy::almost_complete_letter_range)]
@@ -62,16 +61,16 @@ fn main() {
6261
b!();
6362
}
6463

64+
#[clippy::msrv = "1.25"]
6565
fn _under_msrv() {
66-
#![clippy::msrv = "1.25"]
6766
let _ = match 'a' {
6867
'a'..'z' => 1,
6968
_ => 2,
7069
};
7170
}
7271

72+
#[clippy::msrv = "1.26"]
7373
fn _meets_msrv() {
74-
#![clippy::msrv = "1.26"]
7574
let _ = 'a'..'z';
7675
let _ = match 'a' {
7776
'a'..'z' => 1,

tests/ui/almost_complete_letter_range.stderr

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: almost complete ascii letter range
2-
--> $DIR/almost_complete_letter_range.rs:30:17
2+
--> $DIR/almost_complete_letter_range.rs:29:17
33
|
44
LL | let _ = ('a') ..'z';
55
| ^^^^^^--^^^
@@ -9,71 +9,71 @@ LL | let _ = ('a') ..'z';
99
= note: `-D clippy::almost-complete-letter-range` implied by `-D warnings`
1010

1111
error: almost complete ascii letter range
12-
--> $DIR/almost_complete_letter_range.rs:31:17
12+
--> $DIR/almost_complete_letter_range.rs:30:17
1313
|
1414
LL | let _ = 'A' .. ('Z');
1515
| ^^^^--^^^^^^
1616
| |
1717
| help: use an inclusive range: `..=`
1818

1919
error: almost complete ascii letter range
20-
--> $DIR/almost_complete_letter_range.rs:37:13
20+
--> $DIR/almost_complete_letter_range.rs:36:13
2121
|
2222
LL | let _ = (b'a')..(b'z');
2323
| ^^^^^^--^^^^^^
2424
| |
2525
| help: use an inclusive range: `..=`
2626

2727
error: almost complete ascii letter range
28-
--> $DIR/almost_complete_letter_range.rs:38:13
28+
--> $DIR/almost_complete_letter_range.rs:37:13
2929
|
3030
LL | let _ = b'A'..b'Z';
3131
| ^^^^--^^^^
3232
| |
3333
| help: use an inclusive range: `..=`
3434

3535
error: almost complete ascii letter range
36-
--> $DIR/almost_complete_letter_range.rs:43:13
36+
--> $DIR/almost_complete_letter_range.rs:42:13
3737
|
3838
LL | let _ = a!()..'z';
3939
| ^^^^--^^^
4040
| |
4141
| help: use an inclusive range: `..=`
4242

4343
error: almost complete ascii letter range
44-
--> $DIR/almost_complete_letter_range.rs:46:9
44+
--> $DIR/almost_complete_letter_range.rs:45:9
4545
|
4646
LL | b'a'..b'z' if true => 1,
4747
| ^^^^--^^^^
4848
| |
4949
| help: use an inclusive range: `..=`
5050

5151
error: almost complete ascii letter range
52-
--> $DIR/almost_complete_letter_range.rs:47:9
52+
--> $DIR/almost_complete_letter_range.rs:46:9
5353
|
5454
LL | b'A'..b'Z' if true => 2,
5555
| ^^^^--^^^^
5656
| |
5757
| help: use an inclusive range: `..=`
5858

5959
error: almost complete ascii letter range
60-
--> $DIR/almost_complete_letter_range.rs:54:9
60+
--> $DIR/almost_complete_letter_range.rs:53:9
6161
|
6262
LL | 'a'..'z' if true => 1,
6363
| ^^^--^^^
6464
| |
6565
| help: use an inclusive range: `..=`
6666

6767
error: almost complete ascii letter range
68-
--> $DIR/almost_complete_letter_range.rs:55:9
68+
--> $DIR/almost_complete_letter_range.rs:54:9
6969
|
7070
LL | 'A'..'Z' if true => 2,
7171
| ^^^--^^^
7272
| |
7373
| help: use an inclusive range: `..=`
7474

7575
error: almost complete ascii letter range
76-
--> $DIR/almost_complete_letter_range.rs:23:17
76+
--> $DIR/almost_complete_letter_range.rs:22:17
7777
|
7878
LL | let _ = 'a'..'z';
7979
| ^^^--^^^
@@ -86,23 +86,23 @@ LL | b!();
8686
= note: this error originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
8787

8888
error: almost complete ascii letter range
89-
--> $DIR/almost_complete_letter_range.rs:68:9
89+
--> $DIR/almost_complete_letter_range.rs:67:9
9090
|
9191
LL | 'a'..'z' => 1,
9292
| ^^^--^^^
9393
| |
9494
| help: use an inclusive range: `...`
9595

9696
error: almost complete ascii letter range
97-
--> $DIR/almost_complete_letter_range.rs:75:13
97+
--> $DIR/almost_complete_letter_range.rs:74:13
9898
|
9999
LL | let _ = 'a'..'z';
100100
| ^^^--^^^
101101
| |
102102
| help: use an inclusive range: `..=`
103103

104104
error: almost complete ascii letter range
105-
--> $DIR/almost_complete_letter_range.rs:77:9
105+
--> $DIR/almost_complete_letter_range.rs:76:9
106106
|
107107
LL | 'a'..'z' => 1,
108108
| ^^^--^^^

tests/ui/cast_abs_to_unsigned.fixed

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// run-rustfix
22

3-
#![feature(custom_inner_attributes)]
43
#![warn(clippy::cast_abs_to_unsigned)]
54
#![allow(clippy::uninlined_format_args, unused)]
65

@@ -33,16 +32,14 @@ fn main() {
3332
let _ = (x as i64 - y as i64).unsigned_abs() as u32;
3433
}
3534

35+
#[clippy::msrv = "1.50"]
3636
fn msrv_1_50() {
37-
#![clippy::msrv = "1.50"]
38-
3937
let x: i32 = 10;
4038
assert_eq!(10u32, x.abs() as u32);
4139
}
4240

41+
#[clippy::msrv = "1.51"]
4342
fn msrv_1_51() {
44-
#![clippy::msrv = "1.51"]
45-
4643
let x: i32 = 10;
4744
assert_eq!(10u32, x.unsigned_abs());
4845
}

tests/ui/cast_abs_to_unsigned.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// run-rustfix
22

3-
#![feature(custom_inner_attributes)]
43
#![warn(clippy::cast_abs_to_unsigned)]
54
#![allow(clippy::uninlined_format_args, unused)]
65

@@ -33,16 +32,14 @@ fn main() {
3332
let _ = (x as i64 - y as i64).abs() as u32;
3433
}
3534

35+
#[clippy::msrv = "1.50"]
3636
fn msrv_1_50() {
37-
#![clippy::msrv = "1.50"]
38-
3937
let x: i32 = 10;
4038
assert_eq!(10u32, x.abs() as u32);
4139
}
4240

41+
#[clippy::msrv = "1.51"]
4342
fn msrv_1_51() {
44-
#![clippy::msrv = "1.51"]
45-
4643
let x: i32 = 10;
4744
assert_eq!(10u32, x.abs() as u32);
4845
}

0 commit comments

Comments
 (0)