Don't lint excessive_precision on inf

This commit is contained in:
Centri3 2023-06-14 07:12:25 -05:00
parent 1d0d686f10
commit a899034927
7 changed files with 70 additions and 31 deletions

View File

@ -82,19 +82,24 @@ impl<'tcx> LateLintPass<'tcx> for FloatLiteral {
LitFloatType::Suffixed(ast::FloatTy::F64) => Some("f64"), LitFloatType::Suffixed(ast::FloatTy::F64) => Some("f64"),
LitFloatType::Unsuffixed => None LitFloatType::Unsuffixed => None
}; };
let (is_whole, mut float_str) = match fty { let (is_whole, is_inf, mut float_str) = match fty {
FloatTy::F32 => { FloatTy::F32 => {
let value = sym_str.parse::<f32>().unwrap(); let value = sym_str.parse::<f32>().unwrap();
(value.fract() == 0.0, formatter.format(value)) (value.fract() == 0.0, value.is_infinite(), formatter.format(value))
}, },
FloatTy::F64 => { FloatTy::F64 => {
let value = sym_str.parse::<f64>().unwrap(); let value = sym_str.parse::<f64>().unwrap();
(value.fract() == 0.0, formatter.format(value))
(value.fract() == 0.0, value.is_infinite(), formatter.format(value))
}, },
}; };
if is_inf {
return;
}
if is_whole && !sym_str.contains(|c| c == 'e' || c == 'E') { if is_whole && !sym_str.contains(|c| c == 'e' || c == 'E') {
// Normalize the literal by stripping the fractional portion // Normalize the literal by stripping the fractional portion
if sym_str.split('.').next().unwrap() != float_str { if sym_str.split('.').next().unwrap() != float_str {

View File

@ -1,6 +1,12 @@
//@run-rustfix //@run-rustfix
#![warn(clippy::excessive_precision)] #![warn(clippy::excessive_precision)]
#![allow(dead_code, unused_variables, clippy::print_literal, clippy::useless_vec)] #![allow(
dead_code,
overflowing_literals,
unused_variables,
clippy::print_literal,
clippy::useless_vec
)]
fn main() { fn main() {
// Consts // Consts
@ -66,4 +72,11 @@ fn main() {
// issue #7745 // issue #7745
let _ = 0_f64; let _ = 0_f64;
// issue #9910
const INF1: f32 = 1.0e+33f32;
const INF2: f64 = 1.0e+3300f64;
const NEG_INF1: f32 = -1.0e+33f32;
const NEG_INF2: f64 = -1.0e+3300f64;
const NEG_INF3: f32 = -3.40282357e+38_f32;
} }

View File

@ -1,6 +1,12 @@
//@run-rustfix //@run-rustfix
#![warn(clippy::excessive_precision)] #![warn(clippy::excessive_precision)]
#![allow(dead_code, unused_variables, clippy::print_literal, clippy::useless_vec)] #![allow(
dead_code,
overflowing_literals,
unused_variables,
clippy::print_literal,
clippy::useless_vec
)]
fn main() { fn main() {
// Consts // Consts
@ -66,4 +72,11 @@ fn main() {
// issue #7745 // issue #7745
let _ = 1.000_000_000_000_001e-324_f64; let _ = 1.000_000_000_000_001e-324_f64;
// issue #9910
const INF1: f32 = 1.0e+33f32;
const INF2: f64 = 1.0e+3300f64;
const NEG_INF1: f32 = -1.0e+33f32;
const NEG_INF2: f64 = -1.0e+3300f64;
const NEG_INF3: f32 = -3.40282357e+38_f32;
} }

View File

@ -1,5 +1,5 @@
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:15:26 --> $DIR/excessive_precision.rs:21:26
| |
LL | const BAD32_1: f32 = 0.123_456_789_f32; LL | const BAD32_1: f32 = 0.123_456_789_f32;
| ^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_79_f32` | ^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_79_f32`
@ -7,85 +7,85 @@ LL | const BAD32_1: f32 = 0.123_456_789_f32;
= note: `-D clippy::excessive-precision` implied by `-D warnings` = note: `-D clippy::excessive-precision` implied by `-D warnings`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:16:26 --> $DIR/excessive_precision.rs:22:26
| |
LL | const BAD32_2: f32 = 0.123_456_789; LL | const BAD32_2: f32 = 0.123_456_789;
| ^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_79` | ^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_79`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:17:26 --> $DIR/excessive_precision.rs:23:26
| |
LL | const BAD32_3: f32 = 0.100_000_000_000_1; LL | const BAD32_3: f32 = 0.100_000_000_000_1;
| ^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.1` | ^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.1`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:18:29 --> $DIR/excessive_precision.rs:24:29
| |
LL | const BAD32_EDGE: f32 = 1.000_000_9; LL | const BAD32_EDGE: f32 = 1.000_000_9;
| ^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.000_001` | ^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.000_001`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:22:26 --> $DIR/excessive_precision.rs:28:26
| |
LL | const BAD64_3: f64 = 0.100_000_000_000_000_000_1; LL | const BAD64_3: f64 = 0.100_000_000_000_000_000_1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.1` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.1`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:25:22 --> $DIR/excessive_precision.rs:31:22
| |
LL | println!("{:?}", 8.888_888_888_888_888_888_888); LL | println!("{:?}", 8.888_888_888_888_888_888_888);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `8.888_888_888_888_89` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `8.888_888_888_888_89`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:36:22 --> $DIR/excessive_precision.rs:42:22
| |
LL | let bad32: f32 = 1.123_456_789; LL | let bad32: f32 = 1.123_456_789;
| ^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8` | ^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:37:26 --> $DIR/excessive_precision.rs:43:26
| |
LL | let bad32_suf: f32 = 1.123_456_789_f32; LL | let bad32_suf: f32 = 1.123_456_789_f32;
| ^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8_f32` | ^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8_f32`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:38:21 --> $DIR/excessive_precision.rs:44:21
| |
LL | let bad32_inf = 1.123_456_789_f32; LL | let bad32_inf = 1.123_456_789_f32;
| ^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8_f32` | ^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8_f32`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:48:36 --> $DIR/excessive_precision.rs:54:36
| |
LL | let bad_vec32: Vec<f32> = vec![0.123_456_789]; LL | let bad_vec32: Vec<f32> = vec![0.123_456_789];
| ^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_79` | ^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_79`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:49:36 --> $DIR/excessive_precision.rs:55:36
| |
LL | let bad_vec64: Vec<f64> = vec![0.123_456_789_123_456_789]; LL | let bad_vec64: Vec<f64> = vec![0.123_456_789_123_456_789];
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_789_123_456_78` | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0.123_456_789_123_456_78`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:53:24 --> $DIR/excessive_precision.rs:59:24
| |
LL | let bad_e32: f32 = 1.123_456_788_888e-10; LL | let bad_e32: f32 = 1.123_456_788_888e-10;
| ^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8e-10` | ^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8e-10`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:56:27 --> $DIR/excessive_precision.rs:62:27
| |
LL | let bad_bige32: f32 = 1.123_456_788_888E-10; LL | let bad_bige32: f32 = 1.123_456_788_888E-10;
| ^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8E-10` | ^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `1.123_456_8E-10`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:65:13 --> $DIR/excessive_precision.rs:71:13
| |
LL | let _ = 2.225_073_858_507_201_1e-308_f64; LL | let _ = 2.225_073_858_507_201_1e-308_f64;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `2.225_073_858_507_201e-308_f64` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `2.225_073_858_507_201e-308_f64`
error: float has excessive precision error: float has excessive precision
--> $DIR/excessive_precision.rs:68:13 --> $DIR/excessive_precision.rs:74:13
| |
LL | let _ = 1.000_000_000_000_001e-324_f64; LL | let _ = 1.000_000_000_000_001e-324_f64;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0_f64` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or truncating it to: `0_f64`

View File

@ -1,5 +1,6 @@
//@run-rustfix //@run-rustfix
#![warn(clippy::lossy_float_literal)] #![warn(clippy::lossy_float_literal)]
#![allow(overflowing_literals, unused)]
fn main() { fn main() {
// Lossy whole-number float literals // Lossy whole-number float literals
@ -32,4 +33,7 @@ fn main() {
let _: f64 = 1e99; let _: f64 = 1e99;
let _: f64 = 1E99; let _: f64 = 1E99;
let _: f32 = 0.1; let _: f32 = 0.1;
const INF1: f32 = 1000000000000000000000000000000000f32;
const NEG_INF1: f32 = -340282357000000000000000000000000000001_f32;
} }

View File

@ -1,5 +1,6 @@
//@run-rustfix //@run-rustfix
#![warn(clippy::lossy_float_literal)] #![warn(clippy::lossy_float_literal)]
#![allow(overflowing_literals, unused)]
fn main() { fn main() {
// Lossy whole-number float literals // Lossy whole-number float literals
@ -32,4 +33,7 @@ fn main() {
let _: f64 = 1e99; let _: f64 = 1e99;
let _: f64 = 1E99; let _: f64 = 1E99;
let _: f32 = 0.1; let _: f32 = 0.1;
const INF1: f32 = 1000000000000000000000000000000000f32;
const NEG_INF1: f32 = -340282357000000000000000000000000000001_f32;
} }

View File

@ -1,5 +1,5 @@
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:6:18 --> $DIR/lossy_float_literal.rs:7:18
| |
LL | let _: f32 = 16_777_217.0; LL | let _: f32 = 16_777_217.0;
| ^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_216.0` | ^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_216.0`
@ -7,61 +7,61 @@ LL | let _: f32 = 16_777_217.0;
= note: `-D clippy::lossy-float-literal` implied by `-D warnings` = note: `-D clippy::lossy-float-literal` implied by `-D warnings`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:7:18 --> $DIR/lossy_float_literal.rs:8:18
| |
LL | let _: f32 = 16_777_219.0; LL | let _: f32 = 16_777_219.0;
| ^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0` | ^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:8:18 --> $DIR/lossy_float_literal.rs:9:18
| |
LL | let _: f32 = 16_777_219.; LL | let _: f32 = 16_777_219.;
| ^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0` | ^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:9:18 --> $DIR/lossy_float_literal.rs:10:18
| |
LL | let _: f32 = 16_777_219.000; LL | let _: f32 = 16_777_219.000;
| ^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0` | ^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:10:13 --> $DIR/lossy_float_literal.rs:11:13
| |
LL | let _ = 16_777_219f32; LL | let _ = 16_777_219f32;
| ^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220_f32` | ^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220_f32`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:11:19 --> $DIR/lossy_float_literal.rs:12:19
| |
LL | let _: f32 = -16_777_219.0; LL | let _: f32 = -16_777_219.0;
| ^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0` | ^^^^^^^^^^^^ help: consider changing the type or replacing it with: `16_777_220.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:12:18 --> $DIR/lossy_float_literal.rs:13:18
| |
LL | let _: f64 = 9_007_199_254_740_993.0; LL | let _: f64 = 9_007_199_254_740_993.0;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0` | ^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:13:18 --> $DIR/lossy_float_literal.rs:14:18
| |
LL | let _: f64 = 9_007_199_254_740_993.; LL | let _: f64 = 9_007_199_254_740_993.;
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0` | ^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:14:18 --> $DIR/lossy_float_literal.rs:15:18
| |
LL | let _: f64 = 9_007_199_254_740_993.00; LL | let _: f64 = 9_007_199_254_740_993.00;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0` | ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:15:13 --> $DIR/lossy_float_literal.rs:16:13
| |
LL | let _ = 9_007_199_254_740_993f64; LL | let _ = 9_007_199_254_740_993f64;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992_f64` | ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992_f64`
error: literal cannot be represented as the underlying type without loss of precision error: literal cannot be represented as the underlying type without loss of precision
--> $DIR/lossy_float_literal.rs:16:19 --> $DIR/lossy_float_literal.rs:17:19
| |
LL | let _: f64 = -9_007_199_254_740_993.0; LL | let _: f64 = -9_007_199_254_740_993.0;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0` | ^^^^^^^^^^^^^^^^^^^^^^^ help: consider changing the type or replacing it with: `9_007_199_254_740_992.0`