Skip to content

Commit df26c3f

Browse files
author
Evan Typanski
committed
Add external macro guard and test middle MSRV
1 parent 92704b4 commit df26c3f

File tree

6 files changed

+76
-9
lines changed

6 files changed

+76
-9
lines changed

clippy_lints/src/manual_rem_euclid.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use clippy_utils::source::snippet_with_applicability;
44
use clippy_utils::{in_constant, meets_msrv, msrvs, path_to_local};
55
use rustc_errors::Applicability;
66
use rustc_hir::{BinOpKind, Expr, ExprKind, Node, TyKind};
7-
use rustc_lint::{LateContext, LateLintPass};
7+
use rustc_lint::{LateContext, LateLintPass, LintContext};
8+
use rustc_middle::lint::in_external_macro;
89
use rustc_semver::RustcVersion;
910
use rustc_session::{declare_tool_lint, impl_lint_pass};
1011

@@ -55,6 +56,10 @@ impl<'tcx> LateLintPass<'tcx> for ManualRemEuclid {
5556
return;
5657
}
5758

59+
if in_external_macro(cx.sess(), expr.span) {
60+
return;
61+
}
62+
5863
if let ExprKind::Binary(op1, expr1, right) = expr.kind
5964
&& op1.node == BinOpKind::Rem
6065
&& let Some(const1) = check_for_unsigned_int_constant(cx, right)

tests/ui/auxiliary/macro_rules.rs

+8
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,11 @@ macro_rules! ptr_as_ptr_cast {
127127
$ptr as *const i32
128128
};
129129
}
130+
131+
#[macro_export]
132+
macro_rules! manual_rem_euclid {
133+
() => {
134+
let value: i32 = 5;
135+
let _: i32 = ((value % 4) + 4) % 4;
136+
};
137+
}

tests/ui/manual_rem_euclid.fixed

+17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
// run-rustfix
2+
// aux-build:macro_rules.rs
23

34
#![warn(clippy::manual_rem_euclid)]
45

6+
#[macro_use]
7+
extern crate macro_rules;
8+
9+
macro_rules! internal_rem_euclid {
10+
() => {
11+
let value: i32 = 5;
12+
let _: i32 = value.rem_euclid(4);
13+
};
14+
}
15+
516
fn main() {
617
let value: i32 = 5;
718

@@ -25,6 +36,12 @@ fn main() {
2536
// For lint to apply the constant must always be on the RHS of the previous value for %
2637
let _: i32 = 4 % ((value % 4) + 4);
2738
let _: i32 = ((4 % value) + 4) % 4;
39+
40+
// Lint in internal macros
41+
internal_rem_euclid!();
42+
43+
// Do not lint in external macros
44+
manual_rem_euclid!();
2845
}
2946

3047
// Should lint for params too

tests/ui/manual_rem_euclid.rs

+17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
// run-rustfix
2+
// aux-build:macro_rules.rs
23

34
#![warn(clippy::manual_rem_euclid)]
45

6+
#[macro_use]
7+
extern crate macro_rules;
8+
9+
macro_rules! internal_rem_euclid {
10+
() => {
11+
let value: i32 = 5;
12+
let _: i32 = ((value % 4) + 4) % 4;
13+
};
14+
}
15+
516
fn main() {
617
let value: i32 = 5;
718

@@ -25,6 +36,12 @@ fn main() {
2536
// For lint to apply the constant must always be on the RHS of the previous value for %
2637
let _: i32 = 4 % ((value % 4) + 4);
2738
let _: i32 = ((4 % value) + 4) % 4;
39+
40+
// Lint in internal macros
41+
internal_rem_euclid!();
42+
43+
// Do not lint in external macros
44+
manual_rem_euclid!();
2845
}
2946

3047
// Should lint for params too

tests/ui/manual_rem_euclid.stderr

+19-8
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,57 @@
11
error: manual `rem_euclid` implementation
2-
--> $DIR/manual_rem_euclid.rs:8:18
2+
--> $DIR/manual_rem_euclid.rs:19:18
33
|
44
LL | let _: i32 = ((value % 4) + 4) % 4;
55
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using: `value.rem_euclid(4)`
66
|
77
= note: `-D clippy::manual-rem-euclid` implied by `-D warnings`
88

99
error: manual `rem_euclid` implementation
10-
--> $DIR/manual_rem_euclid.rs:9:18
10+
--> $DIR/manual_rem_euclid.rs:20:18
1111
|
1212
LL | let _: i32 = (4 + (value % 4)) % 4;
1313
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using: `value.rem_euclid(4)`
1414

1515
error: manual `rem_euclid` implementation
16-
--> $DIR/manual_rem_euclid.rs:10:18
16+
--> $DIR/manual_rem_euclid.rs:21:18
1717
|
1818
LL | let _: i32 = (value % 4 + 4) % 4;
1919
| ^^^^^^^^^^^^^^^^^^^ help: consider using: `value.rem_euclid(4)`
2020

2121
error: manual `rem_euclid` implementation
22-
--> $DIR/manual_rem_euclid.rs:11:18
22+
--> $DIR/manual_rem_euclid.rs:22:18
2323
|
2424
LL | let _: i32 = (4 + value % 4) % 4;
2525
| ^^^^^^^^^^^^^^^^^^^ help: consider using: `value.rem_euclid(4)`
2626

2727
error: manual `rem_euclid` implementation
28-
--> $DIR/manual_rem_euclid.rs:12:22
28+
--> $DIR/manual_rem_euclid.rs:23:22
2929
|
3030
LL | let _: i32 = 1 + (4 + value % 4) % 4;
3131
| ^^^^^^^^^^^^^^^^^^^ help: consider using: `value.rem_euclid(4)`
3232

3333
error: manual `rem_euclid` implementation
34-
--> $DIR/manual_rem_euclid.rs:32:5
34+
--> $DIR/manual_rem_euclid.rs:12:22
35+
|
36+
LL | let _: i32 = ((value % 4) + 4) % 4;
37+
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using: `value.rem_euclid(4)`
38+
...
39+
LL | internal_rem_euclid!();
40+
| ---------------------- in this macro invocation
41+
|
42+
= note: this error originates in the macro `internal_rem_euclid` (in Nightly builds, run with -Z macro-backtrace for more info)
43+
44+
error: manual `rem_euclid` implementation
45+
--> $DIR/manual_rem_euclid.rs:49:5
3546
|
3647
LL | ((num % 4) + 4) % 4
3748
| ^^^^^^^^^^^^^^^^^^^ help: consider using: `num.rem_euclid(4)`
3849

3950
error: manual `rem_euclid` implementation
40-
--> $DIR/manual_rem_euclid.rs:37:5
51+
--> $DIR/manual_rem_euclid.rs:54:5
4152
|
4253
LL | ((num % 4) + 4) % 4
4354
| ^^^^^^^^^^^^^^^^^^^ help: consider using: `num.rem_euclid(4)`
4455

45-
error: aborting due to 7 previous errors
56+
error: aborting due to 8 previous errors
4657

tests/ui/min_rust_version_attr.rs

+9
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,12 @@ mod just_above_msrv {
217217
}
218218
}
219219
}
220+
221+
mod const_rem_euclid {
222+
#![feature(custom_inner_attributes)]
223+
#![clippy::msrv = "1.50.0"]
224+
225+
pub const fn const_rem_euclid_4(num: i32) -> i32 {
226+
((num % 4) + 4) % 4
227+
}
228+
}

0 commit comments

Comments
 (0)