about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/floating_point_arithmetic.rs86
-rw-r--r--tests/ui/floating_point_log.rs26
-rw-r--r--tests/ui/floating_point_log.stderr74
3 files changed, 4 insertions, 182 deletions
diff --git a/clippy_lints/src/floating_point_arithmetic.rs b/clippy_lints/src/floating_point_arithmetic.rs
index dbf8e0a9ac4..17babb46daa 100644
--- a/clippy_lints/src/floating_point_arithmetic.rs
+++ b/clippy_lints/src/floating_point_arithmetic.rs
@@ -4,12 +4,11 @@ use crate::consts::{
 };
 use crate::utils::*;
 use if_chain::if_chain;
-use rustc::declare_lint_pass;
-use rustc::hir::*;
-use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
+use rustc_hir::*;
+use rustc_lint::{LateContext, LateLintPass};
 use rustc::ty;
 use rustc_errors::Applicability;
-use rustc_session::declare_tool_lint;
+use rustc_session::{declare_lint_pass, declare_tool_lint};
 use std::f32::consts as f32_consts;
 use std::f64::consts as f64_consts;
 use sugg::Sugg;
@@ -278,84 +277,6 @@ fn check_expm1(cx: &LateContext<'_, '_>, expr: &Expr) {
     }
 }
 
-// Checks whether two expressions evaluate to the same value
-fn are_exprs_equivalent(cx: &LateContext<'_, '_>, left: &Expr, right: &Expr) -> bool {
-    // Checks whether the values are constant and equal
-    if_chain! {
-        if let Some((left_value, _)) = constant(cx, cx.tables, left);
-        if let Some((right_value, _)) = constant(cx, cx.tables, right);
-        if left_value == right_value;
-        then {
-            return true;
-        }
-    }
-
-    // Checks whether the expressions resolve to the same variable
-    if_chain! {
-        if let ExprKind::Path(ref left_qpath) = left.kind;
-        if let QPath::Resolved(_, ref left_path) = *left_qpath;
-        if left_path.segments.len() == 1;
-        if let def::Res::Local(left_local_id) = qpath_res(cx, left_qpath, left.hir_id);
-        if let ExprKind::Path(ref right_qpath) = right.kind;
-        if let QPath::Resolved(_, ref right_path) = *right_qpath;
-        if right_path.segments.len() == 1;
-        if let def::Res::Local(right_local_id) = qpath_res(cx, right_qpath, right.hir_id);
-        if left_local_id == right_local_id;
-        then {
-            return true;
-        }
-    }
-
-    false
-}
-
-fn check_log_division(cx: &LateContext<'_, '_>, expr: &Expr) {
-    let log_methods = ["log", "log2", "log10", "ln"];
-
-    if_chain! {
-        if let ExprKind::Binary(op, ref lhs, ref rhs) = expr.kind;
-        if op.node == BinOpKind::Div;
-        if cx.tables.expr_ty(lhs).is_floating_point();
-        if let ExprKind::MethodCall(left_path, _, left_args) = &lhs.kind;
-        if cx.tables.expr_ty(&left_args[0]).is_floating_point();
-        if let ExprKind::MethodCall(right_path, _, right_args) = &rhs.kind;
-        if cx.tables.expr_ty(&right_args[0]).is_floating_point();
-        let left_method = left_path.ident.name.as_str();
-        if left_method == right_path.ident.name.as_str();
-        if log_methods.iter().any(|&method| left_method == method);
-        then {
-            let left_recv = &left_args[0];
-            let right_recv = &right_args[0];
-
-            // Return early when bases are not equal
-            if left_method == "log" && !are_exprs_equivalent(cx, &left_args[1], &right_args[1]) {
-                return;
-            }
-
-            // Reduce the expression further for bases 2, 10 and e
-            let suggestion = if let Some(method) = get_specialized_log_method(cx, right_recv) {
-                format!("{}.{}()", Sugg::hir(cx, left_recv, ".."), method)
-            } else {
-                format!(
-                    "{}.log({})",
-                    Sugg::hir(cx, left_recv, ".."),
-                    Sugg::hir(cx, right_recv, "..")
-                )
-            };
-
-            span_lint_and_sugg(
-                cx,
-                FLOATING_POINT_IMPROVEMENTS,
-                expr.span,
-                "x.log(b) / y.log(b) can be reduced to x.log(y)",
-                "consider using",
-                suggestion,
-                Applicability::MachineApplicable,
-            );
-        }
-    }
-}
-
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for FloatingPointArithmetic {
     fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
         if let ExprKind::MethodCall(ref path, _, args) = &expr.kind {
@@ -371,7 +292,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for FloatingPointArithmetic {
             }
         } else {
             check_expm1(cx, expr);
-            check_log_division(cx, expr);
         }
     }
 }
diff --git a/tests/ui/floating_point_log.rs b/tests/ui/floating_point_log.rs
index 5775d8715d4..18b7686280e 100644
--- a/tests/ui/floating_point_log.rs
+++ b/tests/ui/floating_point_log.rs
@@ -54,30 +54,4 @@ fn check_ln1p() {
     let _ = (1.0 + x - 2.0).ln();
 }
 
-fn check_log_division() {
-    let x = 3f32;
-    let y = 2f32;
-    let b = 4f32;
-
-    let _ = x.log2() / y.log2();
-    let _ = x.log10() / y.log10();
-    let _ = x.ln() / y.ln();
-    let _ = x.log(4.0) / y.log(4.0);
-    let _ = x.log(b) / y.log(b);
-    let _ = x.log(b) / y.log(x);
-    let _ = x.log(b) / 2f32.log(b);
-
-    let x = 3f64;
-    let y = 2f64;
-    let b = 4f64;
-
-    let _ = x.log2() / y.log2();
-    let _ = x.log10() / y.log10();
-    let _ = x.ln() / y.ln();
-    let _ = x.log(4.0) / y.log(4.0);
-    let _ = x.log(b) / y.log(b);
-    let _ = x.log(b) / y.log(x);
-    let _ = x.log(b) / 2f64.log(b);
-}
-
 fn main() {}
diff --git a/tests/ui/floating_point_log.stderr b/tests/ui/floating_point_log.stderr
index cd3142e041a..c169745ddf9 100644
--- a/tests/ui/floating_point_log.stderr
+++ b/tests/ui/floating_point_log.stderr
@@ -168,77 +168,5 @@ error: ln(1 + x) can be computed more accurately
 LL |     let _ = (x * 2.0 + 1.0).ln();
    |             ^^^^^^^^^^^^^^^^^^^^ help: consider using: `(x * 2.0).ln_1p()`
 
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:62:13
-   |
-LL |     let _ = x.log2() / y.log2();
-   |             ^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:63:13
-   |
-LL |     let _ = x.log10() / y.log10();
-   |             ^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:64:13
-   |
-LL |     let _ = x.ln() / y.ln();
-   |             ^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:65:13
-   |
-LL |     let _ = x.log(4.0) / y.log(4.0);
-   |             ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:66:13
-   |
-LL |     let _ = x.log(b) / y.log(b);
-   |             ^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:68:13
-   |
-LL |     let _ = x.log(b) / 2f32.log(b);
-   |             ^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log2()`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:74:13
-   |
-LL |     let _ = x.log2() / y.log2();
-   |             ^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:75:13
-   |
-LL |     let _ = x.log10() / y.log10();
-   |             ^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:76:13
-   |
-LL |     let _ = x.ln() / y.ln();
-   |             ^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:77:13
-   |
-LL |     let _ = x.log(4.0) / y.log(4.0);
-   |             ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:78:13
-   |
-LL |     let _ = x.log(b) / y.log(b);
-   |             ^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log(y)`
-
-error: x.log(b) / y.log(b) can be reduced to x.log(y)
-  --> $DIR/floating_point_log.rs:80:13
-   |
-LL |     let _ = x.log(b) / 2f64.log(b);
-   |             ^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.log2()`
-
-error: aborting due to 40 previous errors
+error: aborting due to 28 previous errors