Skip to content

Commit bc845c2

Browse files
committed
Disable arithmetic lints in constant items
1 parent dae7abb commit bc845c2

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

clippy_lints/src/arithmetic.rs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
use crate::utils::span_lint;
12-
use crate::rustc::hir;
12+
use crate::rustc::hir::{self, Item, ItemKind};
1313
use crate::rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
1414
use crate::rustc::{declare_tool_lint, lint_array};
1515
use crate::syntax::source_map::Span;
@@ -51,7 +51,8 @@ declare_clippy_lint! {
5151

5252
#[derive(Copy, Clone, Default)]
5353
pub struct Arithmetic {
54-
span: Option<Span>,
54+
expr_span: Option<Span>,
55+
item_span: Option<Span>,
5556
}
5657

5758
impl LintPass for Arithmetic {
@@ -62,9 +63,15 @@ impl LintPass for Arithmetic {
6263

6364
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic {
6465
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr) {
65-
if self.span.is_some() {
66+
if self.expr_span.is_some() {
6667
return;
6768
}
69+
70+
if let Some(span) = self.item_span {
71+
if span.contains(expr.span) {
72+
return;
73+
}
74+
}
6875
match expr.node {
6976
hir::ExprKind::Binary(ref op, ref l, ref r) => {
7077
match op.node {
@@ -86,29 +93,47 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic {
8693
let (l_ty, r_ty) = (cx.tables.expr_ty(l), cx.tables.expr_ty(r));
8794
if l_ty.is_integral() && r_ty.is_integral() {
8895
span_lint(cx, INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected");
89-
self.span = Some(expr.span);
96+
self.expr_span = Some(expr.span);
9097
} else if l_ty.is_floating_point() && r_ty.is_floating_point() {
9198
span_lint(cx, FLOAT_ARITHMETIC, expr.span, "floating-point arithmetic detected");
92-
self.span = Some(expr.span);
99+
self.expr_span = Some(expr.span);
93100
}
94101
},
95102
hir::ExprKind::Unary(hir::UnOp::UnNeg, ref arg) => {
96103
let ty = cx.tables.expr_ty(arg);
97104
if ty.is_integral() {
98105
span_lint(cx, INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected");
99-
self.span = Some(expr.span);
106+
self.expr_span = Some(expr.span);
100107
} else if ty.is_floating_point() {
101108
span_lint(cx, FLOAT_ARITHMETIC, expr.span, "floating-point arithmetic detected");
102-
self.span = Some(expr.span);
109+
self.expr_span = Some(expr.span);
103110
}
104111
},
105112
_ => (),
106113
}
107114
}
108115

109116
fn check_expr_post(&mut self, _: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr) {
110-
if Some(expr.span) == self.span {
111-
self.span = None;
117+
if Some(expr.span) == self.expr_span {
118+
self.expr_span = None;
119+
}
120+
}
121+
122+
fn check_item(&mut self, _: &LateContext<'_, '_>, item: &Item) {
123+
match item.node {
124+
ItemKind::Enum(..)
125+
| ItemKind::Const(..)
126+
| ItemKind::Static(..) => self.item_span = Some(item.span),
127+
_ => (),
128+
}
129+
}
130+
131+
fn check_item_post(&mut self, _: &LateContext<'_, '_>, item: &Item) {
132+
match item.node {
133+
ItemKind::Enum(..)
134+
| ItemKind::Const(..)
135+
| ItemKind::Static(..) => self.item_span = None,
136+
_ => (),
112137
}
113138
}
114139
}

tests/ui/arithmetic.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,12 @@ fn main() {
3737
f / 2.0;
3838
f - 2.0 * 4.2;
3939
-f;
40+
41+
// No errors for the following items because they are constant expressions
42+
enum Foo {
43+
Bar = -2,
44+
}
45+
46+
const FOO: i32 = -2;
47+
static BAR: i32 = -2;
4048
}

0 commit comments

Comments
 (0)