Skip to content

Commit 826a893

Browse files
committed
Auto merge of #9467 - pyhrr0:macro_expansion, r=giraffate
Fix `almost_complete_letter_range` false positive. changelog: Fix [`almost_complete_letter_range`] false positive in an external macro
2 parents 6466258 + 69c7d2c commit 826a893

5 files changed

+61
-13
lines changed

clippy_lints/src/almost_complete_letter_range.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use clippy_utils::{meets_msrv, msrvs};
44
use rustc_ast::ast::{Expr, ExprKind, LitKind, Pat, PatKind, RangeEnd, RangeLimits};
55
use rustc_errors::Applicability;
66
use rustc_lint::{EarlyContext, EarlyLintPass, LintContext};
7+
use rustc_middle::lint::in_external_macro;
78
use rustc_semver::RustcVersion;
89
use rustc_session::{declare_tool_lint, impl_lint_pass};
910
use rustc_span::Span;
@@ -79,6 +80,7 @@ fn check_range(cx: &EarlyContext<'_>, span: Span, start: &Expr, end: &Expr, sugg
7980
(LitKind::Byte(b'a') | LitKind::Char('a'), LitKind::Byte(b'z') | LitKind::Char('z'))
8081
| (LitKind::Byte(b'A') | LitKind::Char('A'), LitKind::Byte(b'Z') | LitKind::Char('Z'))
8182
)
83+
&& !in_external_macro(cx.sess(), span)
8284
{
8385
span_lint_and_then(
8486
cx,

tests/ui/almost_complete_letter_range.fixed

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// run-rustfix
22
// edition:2018
3+
// aux-build:macro_rules.rs
34

45
#![feature(custom_inner_attributes)]
56
#![feature(exclusive_range_pattern)]
@@ -8,12 +9,21 @@
89
#![allow(ellipsis_inclusive_range_patterns)]
910
#![allow(clippy::needless_parens_on_range_literals)]
1011

12+
#[macro_use]
13+
extern crate macro_rules;
14+
1115
macro_rules! a {
1216
() => {
1317
'a'
1418
};
1519
}
1620

21+
macro_rules! b {
22+
() => {
23+
let _ = 'a'..='z';
24+
};
25+
}
26+
1727
fn main() {
1828
#[rustfmt::skip]
1929
{
@@ -47,6 +57,9 @@ fn main() {
4757
'B'..'Z' => 4,
4858
_ => 5,
4959
};
60+
61+
almost_complete_letter_range!();
62+
b!();
5063
}
5164

5265
fn _under_msrv() {

tests/ui/almost_complete_letter_range.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// run-rustfix
22
// edition:2018
3+
// aux-build:macro_rules.rs
34

45
#![feature(custom_inner_attributes)]
56
#![feature(exclusive_range_pattern)]
@@ -8,12 +9,21 @@
89
#![allow(ellipsis_inclusive_range_patterns)]
910
#![allow(clippy::needless_parens_on_range_literals)]
1011

12+
#[macro_use]
13+
extern crate macro_rules;
14+
1115
macro_rules! a {
1216
() => {
1317
'a'
1418
};
1519
}
1620

21+
macro_rules! b {
22+
() => {
23+
let _ = 'a'..'z';
24+
};
25+
}
26+
1727
fn main() {
1828
#[rustfmt::skip]
1929
{
@@ -47,6 +57,9 @@ fn main() {
4757
'B'..'Z' => 4,
4858
_ => 5,
4959
};
60+
61+
almost_complete_letter_range!();
62+
b!();
5063
}
5164

5265
fn _under_msrv() {
Lines changed: 26 additions & 13 deletions
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:20:17
2+
--> $DIR/almost_complete_letter_range.rs:30:17
33
|
44
LL | let _ = ('a') ..'z';
55
| ^^^^^^--^^^
@@ -9,92 +9,105 @@ 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:21:17
12+
--> $DIR/almost_complete_letter_range.rs:31: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:27:13
20+
--> $DIR/almost_complete_letter_range.rs:37: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:28:13
28+
--> $DIR/almost_complete_letter_range.rs:38: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:33:13
36+
--> $DIR/almost_complete_letter_range.rs:43: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:36:9
44+
--> $DIR/almost_complete_letter_range.rs:46: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:37:9
52+
--> $DIR/almost_complete_letter_range.rs:47: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:44:9
60+
--> $DIR/almost_complete_letter_range.rs:54: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:45:9
68+
--> $DIR/almost_complete_letter_range.rs:55: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:55:9
76+
--> $DIR/almost_complete_letter_range.rs:23:17
77+
|
78+
LL | let _ = 'a'..'z';
79+
| ^^^--^^^
80+
| |
81+
| help: use an inclusive range: `..=`
82+
...
83+
LL | b!();
84+
| ---- in this macro invocation
85+
|
86+
= note: this error originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
87+
88+
error: almost complete ascii letter range
89+
--> $DIR/almost_complete_letter_range.rs:68:9
7790
|
7891
LL | 'a'..'z' => 1,
7992
| ^^^--^^^
8093
| |
8194
| help: use an inclusive range: `...`
8295

8396
error: almost complete ascii letter range
84-
--> $DIR/almost_complete_letter_range.rs:62:13
97+
--> $DIR/almost_complete_letter_range.rs:75:13
8598
|
8699
LL | let _ = 'a'..'z';
87100
| ^^^--^^^
88101
| |
89102
| help: use an inclusive range: `..=`
90103

91104
error: almost complete ascii letter range
92-
--> $DIR/almost_complete_letter_range.rs:64:9
105+
--> $DIR/almost_complete_letter_range.rs:77:9
93106
|
94107
LL | 'a'..'z' => 1,
95108
| ^^^--^^^
96109
| |
97110
| help: use an inclusive range: `..=`
98111

99-
error: aborting due to 12 previous errors
112+
error: aborting due to 13 previous errors
100113

tests/ui/auxiliary/macro_rules.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,10 @@ macro_rules! manual_rem_euclid {
140140
macro_rules! equatable_if_let {
141141
($a:ident) => {{ if let 2 = $a {} }};
142142
}
143+
144+
#[macro_export]
145+
macro_rules! almost_complete_letter_range {
146+
() => {
147+
let _ = 'a'..'z';
148+
};
149+
}

0 commit comments

Comments
 (0)