Fix {subopt,imprec}_float not lint const.*(const)
Fixes #9402 Fixes #9201
This commit is contained in:
parent
09e4659a86
commit
6e14e60af4
@ -238,23 +238,23 @@ fn get_integer_from_float_constant(value: &Constant) -> Option<i32> {
|
||||
fn check_powf(cx: &LateContext<'_>, expr: &Expr<'_>, args: &[Expr<'_>]) {
|
||||
// Check receiver
|
||||
if let Some((value, _)) = constant(cx, cx.typeck_results(), &args[0]) {
|
||||
let method = if F32(f32_consts::E) == value || F64(f64_consts::E) == value {
|
||||
"exp"
|
||||
if let Some(method) = if F32(f32_consts::E) == value || F64(f64_consts::E) == value {
|
||||
Some("exp")
|
||||
} else if F32(2.0) == value || F64(2.0) == value {
|
||||
"exp2"
|
||||
Some("exp2")
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
SUBOPTIMAL_FLOPS,
|
||||
expr.span,
|
||||
"exponent for bases 2 and e can be computed more accurately",
|
||||
"consider using",
|
||||
format!("{}.{}()", prepare_receiver_sugg(cx, &args[1]), method),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
None
|
||||
} {
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
SUBOPTIMAL_FLOPS,
|
||||
expr.span,
|
||||
"exponent for bases 2 and e can be computed more accurately",
|
||||
"consider using",
|
||||
format!("{}.{}()", prepare_receiver_sugg(cx, &args[1]), method),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Check argument
|
||||
|
@ -18,6 +18,11 @@ fn main() {
|
||||
let _ = x.powi(-16_777_215);
|
||||
let _ = (x as f32).powi(-16_777_215);
|
||||
let _ = (x as f32).powi(3);
|
||||
let _ = (1.5_f32 + 1.0).cbrt();
|
||||
let _ = 1.5_f64.cbrt();
|
||||
let _ = 1.5_f64.sqrt();
|
||||
let _ = 1.5_f64.powi(3);
|
||||
|
||||
// Cases where the lint shouldn't be applied
|
||||
let _ = x.powf(2.1);
|
||||
let _ = x.powf(-2.1);
|
||||
|
@ -18,6 +18,11 @@ fn main() {
|
||||
let _ = x.powf(-16_777_215.0);
|
||||
let _ = (x as f32).powf(-16_777_215.0);
|
||||
let _ = (x as f32).powf(3.0);
|
||||
let _ = (1.5_f32 + 1.0).powf(1.0 / 3.0);
|
||||
let _ = 1.5_f64.powf(1.0 / 3.0);
|
||||
let _ = 1.5_f64.powf(1.0 / 2.0);
|
||||
let _ = 1.5_f64.powf(3.0);
|
||||
|
||||
// Cases where the lint shouldn't be applied
|
||||
let _ = x.powf(2.1);
|
||||
let _ = x.powf(-2.1);
|
||||
|
@ -92,77 +92,101 @@ error: exponentiation with integer powers can be computed more efficiently
|
||||
LL | let _ = (x as f32).powf(3.0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: consider using: `(x as f32).powi(3)`
|
||||
|
||||
error: cube-root of a number can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:21:13
|
||||
|
|
||||
LL | let _ = (1.5_f32 + 1.0).powf(1.0 / 3.0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `(1.5_f32 + 1.0).cbrt()`
|
||||
|
||||
error: cube-root of a number can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:22:13
|
||||
|
|
||||
LL | let _ = 1.5_f64.powf(1.0 / 3.0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `1.5_f64.cbrt()`
|
||||
|
||||
error: square-root of a number can be computed more efficiently and accurately
|
||||
--> $DIR/floating_point_powf.rs:23:13
|
||||
|
|
||||
LL | let _ = 1.5_f64.powf(1.0 / 2.0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `1.5_f64.sqrt()`
|
||||
|
||||
error: exponentiation with integer powers can be computed more efficiently
|
||||
--> $DIR/floating_point_powf.rs:24:13
|
||||
|
|
||||
LL | let _ = 1.5_f64.powf(3.0);
|
||||
| ^^^^^^^^^^^^^^^^^ help: consider using: `1.5_f64.powi(3)`
|
||||
|
||||
error: exponent for bases 2 and e can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:28:13
|
||||
--> $DIR/floating_point_powf.rs:33:13
|
||||
|
|
||||
LL | let _ = 2f64.powf(x);
|
||||
| ^^^^^^^^^^^^ help: consider using: `x.exp2()`
|
||||
|
||||
error: exponent for bases 2 and e can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:29:13
|
||||
--> $DIR/floating_point_powf.rs:34:13
|
||||
|
|
||||
LL | let _ = 2f64.powf(3.1);
|
||||
| ^^^^^^^^^^^^^^ help: consider using: `3.1f64.exp2()`
|
||||
|
||||
error: exponent for bases 2 and e can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:30:13
|
||||
--> $DIR/floating_point_powf.rs:35:13
|
||||
|
|
||||
LL | let _ = 2f64.powf(-3.1);
|
||||
| ^^^^^^^^^^^^^^^ help: consider using: `(-3.1f64).exp2()`
|
||||
|
||||
error: exponent for bases 2 and e can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:31:13
|
||||
--> $DIR/floating_point_powf.rs:36:13
|
||||
|
|
||||
LL | let _ = std::f64::consts::E.powf(x);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.exp()`
|
||||
|
||||
error: exponent for bases 2 and e can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:32:13
|
||||
--> $DIR/floating_point_powf.rs:37:13
|
||||
|
|
||||
LL | let _ = std::f64::consts::E.powf(3.1);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `3.1f64.exp()`
|
||||
|
||||
error: exponent for bases 2 and e can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:33:13
|
||||
--> $DIR/floating_point_powf.rs:38:13
|
||||
|
|
||||
LL | let _ = std::f64::consts::E.powf(-3.1);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `(-3.1f64).exp()`
|
||||
|
||||
error: square-root of a number can be computed more efficiently and accurately
|
||||
--> $DIR/floating_point_powf.rs:34:13
|
||||
--> $DIR/floating_point_powf.rs:39:13
|
||||
|
|
||||
LL | let _ = x.powf(1.0 / 2.0);
|
||||
| ^^^^^^^^^^^^^^^^^ help: consider using: `x.sqrt()`
|
||||
|
||||
error: cube-root of a number can be computed more accurately
|
||||
--> $DIR/floating_point_powf.rs:35:13
|
||||
--> $DIR/floating_point_powf.rs:40:13
|
||||
|
|
||||
LL | let _ = x.powf(1.0 / 3.0);
|
||||
| ^^^^^^^^^^^^^^^^^ help: consider using: `x.cbrt()`
|
||||
|
||||
error: exponentiation with integer powers can be computed more efficiently
|
||||
--> $DIR/floating_point_powf.rs:36:13
|
||||
--> $DIR/floating_point_powf.rs:41:13
|
||||
|
|
||||
LL | let _ = x.powf(3.0);
|
||||
| ^^^^^^^^^^^ help: consider using: `x.powi(3)`
|
||||
|
||||
error: exponentiation with integer powers can be computed more efficiently
|
||||
--> $DIR/floating_point_powf.rs:37:13
|
||||
--> $DIR/floating_point_powf.rs:42:13
|
||||
|
|
||||
LL | let _ = x.powf(-2.0);
|
||||
| ^^^^^^^^^^^^ help: consider using: `x.powi(-2)`
|
||||
|
||||
error: exponentiation with integer powers can be computed more efficiently
|
||||
--> $DIR/floating_point_powf.rs:38:13
|
||||
--> $DIR/floating_point_powf.rs:43:13
|
||||
|
|
||||
LL | let _ = x.powf(-2_147_483_648.0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.powi(-2_147_483_648)`
|
||||
|
||||
error: exponentiation with integer powers can be computed more efficiently
|
||||
--> $DIR/floating_point_powf.rs:39:13
|
||||
--> $DIR/floating_point_powf.rs:44:13
|
||||
|
|
||||
LL | let _ = x.powf(2_147_483_647.0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.powi(2_147_483_647)`
|
||||
|
||||
error: aborting due to 27 previous errors
|
||||
error: aborting due to 31 previous errors
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user