mirror of
https://github.com/rust-lang/rust-clippy
synced 2025-02-17 14:38:46 +00:00
Auto merge of #9404 - lukaslueg:issue9402, r=giraffate
Fix `suboptimal_float` not linting on `{const}.powf({const})` There used to be an early return if the receiver was an effective const but the method was not linted, not taking into account later cases where the receiver and the arguments are both effective consts for different methods. Removed the early return. Fixes #9402 Fixes #9201 changelog: Fix `suboptimal_flops`, `imprecise_flops` not linting on `{const}.powf({const})` et al
This commit is contained in:
commit
a80e278036
4 changed files with 62 additions and 28 deletions
|
@ -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…
Add table
Reference in a new issue