]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/erasing_op.rs
Auto merge of #3646 - matthiaskrgr:travis, r=phansch
[rust.git] / clippy_lints / src / erasing_op.rs
1 use crate::consts::{constant_simple, Constant};
2 use crate::utils::{in_macro, span_lint};
3 use rustc::hir::*;
4 use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
5 use rustc::{declare_tool_lint, lint_array};
6 use syntax::source_map::Span;
7
8 /// **What it does:** Checks for erasing operations, e.g. `x * 0`.
9 ///
10 /// **Why is this bad?** The whole expression can be replaced by zero.
11 /// This is most likely not the intended outcome and should probably be
12 /// corrected
13 ///
14 /// **Known problems:** None.
15 ///
16 /// **Example:**
17 /// ```rust
18 /// 0 / x;
19 /// 0 * x;
20 /// x & 0
21 /// ```
22 declare_clippy_lint! {
23     pub ERASING_OP,
24     correctness,
25     "using erasing operations, e.g. `x * 0` or `y & 0`"
26 }
27
28 #[derive(Copy, Clone)]
29 pub struct ErasingOp;
30
31 impl LintPass for ErasingOp {
32     fn get_lints(&self) -> LintArray {
33         lint_array!(ERASING_OP)
34     }
35 }
36
37 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ErasingOp {
38     fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) {
39         if in_macro(e.span) {
40             return;
41         }
42         if let ExprKind::Binary(ref cmp, ref left, ref right) = e.node {
43             match cmp.node {
44                 BinOpKind::Mul | BinOpKind::BitAnd => {
45                     check(cx, left, e.span);
46                     check(cx, right, e.span);
47                 },
48                 BinOpKind::Div => check(cx, left, e.span),
49                 _ => (),
50             }
51         }
52     }
53 }
54
55 fn check(cx: &LateContext<'_, '_>, e: &Expr, span: Span) {
56     if let Some(Constant::Int(v)) = constant_simple(cx, cx.tables, e) {
57         if v == 0 {
58             span_lint(
59                 cx,
60                 ERASING_OP,
61                 span,
62                 "this operation will always return zero. This is likely not the intended outcome",
63             );
64         }
65     }
66 }