default_numeric_fallback: Add more tests for floating literal

This commit is contained in:
Yoshitomo Nakanishi 2021-07-09 14:51:16 +09:00
parent 3bc5abef62
commit 04aa3f7e9b
4 changed files with 349 additions and 66 deletions

View File

@ -0,0 +1,174 @@
// aux-build:macro_rules.rs
#![warn(clippy::default_numeric_fallback)]
#![allow(unused)]
#![allow(clippy::never_loop)]
#![allow(clippy::no_effect)]
#![allow(clippy::unnecessary_operation)]
#![allow(clippy::branches_sharing_code)]
#![allow(clippy::branches_sharing_code)]
#![allow(clippy::match_single_binding)]
#[macro_use]
extern crate macro_rules;
mod basic_expr {
fn test() {
// Should lint unsuffixed literals typed `f64`.
let x = 0.12;
let x = [1., 2., 3.];
let x = if true { (1., 2.) } else { (3., 4.) };
let x = match 1. {
_ => 1.,
};
// Should NOT lint suffixed literals.
let x = 0.12_f64;
// Should NOT lint literals in init expr if `Local` has a type annotation.
let x: f64 = 0.1;
let x: [f64; 3] = [1., 2., 3.];
let x: (f64, f64) = if true { (1., 2.) } else { (3., 4.) };
let x: _ = 1.;
}
}
mod nested_local {
fn test() {
let x: _ = {
// Should lint this because this literal is not bound to any types.
let y = 1.;
// Should NOT lint this because this literal is bound to `_` of outer `Local`.
1.
};
let x: _ = if true {
// Should lint this because this literal is not bound to any types.
let y = 1.;
// Should NOT lint this because this literal is bound to `_` of outer `Local`.
1.
} else {
// Should lint this because this literal is not bound to any types.
let y = 1.;
// Should NOT lint this because this literal is bound to `_` of outer `Local`.
2.
};
}
}
mod function_def {
fn ret_f64() -> f64 {
// Even though the output type is specified,
// this unsuffixed literal is linted to reduce heuristics and keep codebase simple.
1.
}
fn test() {
// Should lint this because return type is inferred to `f64` and NOT bound to a concrete
// type.
let f = || -> _ { 1. };
// Even though the output type is specified,
// this unsuffixed literal is linted to reduce heuristics and keep codebase simple.
let f = || -> f64 { 1. };
}
}
mod function_calls {
fn concrete_arg(f: f64) {}
fn generic_arg<T>(t: T) {}
fn test() {
// Should NOT lint this because the argument type is bound to a concrete type.
concrete_arg(1.);
// Should lint this because the argument type is inferred to `f64` and NOT bound to a concrete type.
generic_arg(1.);
// Should lint this because the argument type is inferred to `f64` and NOT bound to a concrete type.
let x: _ = generic_arg(1.);
}
}
mod struct_ctor {
struct ConcreteStruct {
x: f64,
}
struct GenericStruct<T> {
x: T,
}
fn test() {
// Should NOT lint this because the field type is bound to a concrete type.
ConcreteStruct { x: 1. };
// Should lint this because the field type is inferred to `f64` and NOT bound to a concrete type.
GenericStruct { x: 1. };
// Should lint this because the field type is inferred to `f64` and NOT bound to a concrete type.
let _ = GenericStruct { x: 1. };
}
}
mod enum_ctor {
enum ConcreteEnum {
X(f64),
}
enum GenericEnum<T> {
X(T),
}
fn test() {
// Should NOT lint this because the field type is bound to a concrete type.
ConcreteEnum::X(1.);
// Should lint this because the field type is inferred to `f64` and NOT bound to a concrete type.
GenericEnum::X(1.);
}
}
mod method_calls {
struct StructForMethodCallTest {}
impl StructForMethodCallTest {
fn concrete_arg(&self, f: f64) {}
fn generic_arg<T>(&self, t: T) {}
}
fn test() {
let s = StructForMethodCallTest {};
// Should NOT lint this because the argument type is bound to a concrete type.
s.concrete_arg(1.);
// Should lint this because the argument type is bound to a concrete type.
s.generic_arg(1.);
}
}
mod in_macro {
macro_rules! internal_macro {
() => {
let x = 22.;
};
}
// Should lint in internal macro.
fn internal() {
internal_macro!();
}
// Should NOT lint in external macro.
fn external() {
default_numeric_fallback!();
}
}
fn main() {}

View File

@ -0,0 +1,147 @@
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:18:17
|
LL | let x = 0.12;
| ^^^^ help: consider adding suffix: `0.12_f64`
|
= note: `-D clippy::default-numeric-fallback` implied by `-D warnings`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:19:18
|
LL | let x = [1., 2., 3.];
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:19:22
|
LL | let x = [1., 2., 3.];
| ^^ help: consider adding suffix: `2._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:19:26
|
LL | let x = [1., 2., 3.];
| ^^ help: consider adding suffix: `3._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:20:28
|
LL | let x = if true { (1., 2.) } else { (3., 4.) };
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:20:32
|
LL | let x = if true { (1., 2.) } else { (3., 4.) };
| ^^ help: consider adding suffix: `2._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:20:46
|
LL | let x = if true { (1., 2.) } else { (3., 4.) };
| ^^ help: consider adding suffix: `3._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:20:50
|
LL | let x = if true { (1., 2.) } else { (3., 4.) };
| ^^ help: consider adding suffix: `4._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:21:23
|
LL | let x = match 1. {
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:22:18
|
LL | _ => 1.,
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:40:21
|
LL | let y = 1.;
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:48:21
|
LL | let y = 1.;
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:54:21
|
LL | let y = 1.;
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:66:9
|
LL | 1.
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:72:27
|
LL | let f = || -> _ { 1. };
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:76:29
|
LL | let f = || -> f64 { 1. };
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:90:21
|
LL | generic_arg(1.);
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:93:32
|
LL | let x: _ = generic_arg(1.);
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:111:28
|
LL | GenericStruct { x: 1. };
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:114:36
|
LL | let _ = GenericStruct { x: 1. };
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:132:24
|
LL | GenericEnum::X(1.);
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:152:23
|
LL | s.generic_arg(1.);
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback_f64.rs:159:21
|
LL | let x = 22.;
| ^^^ help: consider adding suffix: `22._f64`
...
LL | internal_macro!();
| ------------------ in this macro invocation
|
= note: this error originates in the macro `internal_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 23 previous errors

View File

@ -21,15 +21,10 @@ mod basic_expr {
_ => 2,
};
// Should lint unsuffixed literals typed `f64`.
let x = 0.12;
// Should NOT lint suffixed literals.
let x = 22_i32;
let x = 0.12_f64;
// Should NOT lint literals in init expr if `Local` has a type annotation.
let x: f64 = 0.1;
let x: [i32; 3] = [1, 2, 3];
let x: (i32, i32) = if true { (1, 2) } else { (3, 4) };
let x: _ = 1;
@ -81,25 +76,17 @@ mod function_def {
}
mod function_calls {
fn concrete_arg_i32(x: i32) {}
fn concrete_arg_f64(f: f64) {}
fn concrete_arg(x: i32) {}
fn generic_arg<T>(t: T) {}
fn test() {
// Should NOT lint this because the argument type is bound to a concrete type.
concrete_arg_i32(1);
// Should NOT lint this because the argument type is bound to a concrete type.
concrete_arg_f64(1.);
concrete_arg(1);
// Should lint this because the argument type is inferred to `i32` and NOT bound to a concrete type.
generic_arg(1);
// Should lint this because the argument type is inferred to `f32` and NOT bound to a concrete type.
generic_arg(1.0);
// Should lint this because the argument type is inferred to `i32` and NOT bound to a concrete type.
let x: _ = generic_arg(1);
}
@ -129,7 +116,6 @@ mod struct_ctor {
mod enum_ctor {
enum ConcreteEnum {
X(i32),
Y(f64),
}
enum GenericEnum<T> {
@ -140,14 +126,8 @@ mod enum_ctor {
// Should NOT lint this because the field type is bound to a concrete type.
ConcreteEnum::X(1);
// Should NOT lint this because the field type is bound to a concrete type.
ConcreteEnum::Y(1.);
// Should lint this because the field type is inferred to `i32` and NOT bound to a concrete type.
GenericEnum::X(1);
// Should lint this because the field type is inferred to `f64` and NOT bound to a concrete type.
GenericEnum::X(1.);
}
}

View File

@ -1,5 +1,5 @@
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:16:17
--> $DIR/default_numeric_fallback_i32.rs:16:17
|
LL | let x = 22;
| ^^ help: consider adding suffix: `22_i32`
@ -7,163 +7,145 @@ LL | let x = 22;
= note: `-D clippy::default-numeric-fallback` implied by `-D warnings`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:17:18
--> $DIR/default_numeric_fallback_i32.rs:17:18
|
LL | let x = [1, 2, 3];
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:17:21
--> $DIR/default_numeric_fallback_i32.rs:17:21
|
LL | let x = [1, 2, 3];
| ^ help: consider adding suffix: `2_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:17:24
--> $DIR/default_numeric_fallback_i32.rs:17:24
|
LL | let x = [1, 2, 3];
| ^ help: consider adding suffix: `3_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:18:28
--> $DIR/default_numeric_fallback_i32.rs:18:28
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:18:31
--> $DIR/default_numeric_fallback_i32.rs:18:31
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `2_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:18:44
--> $DIR/default_numeric_fallback_i32.rs:18:44
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `3_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:18:47
--> $DIR/default_numeric_fallback_i32.rs:18:47
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `4_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:19:23
--> $DIR/default_numeric_fallback_i32.rs:19:23
|
LL | let x = match 1 {
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:20:13
--> $DIR/default_numeric_fallback_i32.rs:20:13
|
LL | 1 => 1,
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:20:18
--> $DIR/default_numeric_fallback_i32.rs:20:18
|
LL | 1 => 1,
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:21:18
--> $DIR/default_numeric_fallback_i32.rs:21:18
|
LL | _ => 2,
| ^ help: consider adding suffix: `2_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:25:17
|
LL | let x = 0.12;
| ^^^^ help: consider adding suffix: `0.12_f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:43:21
--> $DIR/default_numeric_fallback_i32.rs:38:21
|
LL | let y = 1;
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:51:21
--> $DIR/default_numeric_fallback_i32.rs:46:21
|
LL | let y = 1;
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:57:21
--> $DIR/default_numeric_fallback_i32.rs:52:21
|
LL | let y = 1;
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:69:9
--> $DIR/default_numeric_fallback_i32.rs:64:9
|
LL | 1
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:75:27
--> $DIR/default_numeric_fallback_i32.rs:70:27
|
LL | let f = || -> _ { 1 };
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:79:29
--> $DIR/default_numeric_fallback_i32.rs:74:29
|
LL | let f = || -> i32 { 1 };
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:98:21
--> $DIR/default_numeric_fallback_i32.rs:88:21
|
LL | generic_arg(1);
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:101:21
|
LL | generic_arg(1.0);
| ^^^ help: consider adding suffix: `1.0_f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:104:32
--> $DIR/default_numeric_fallback_i32.rs:91:32
|
LL | let x: _ = generic_arg(1);
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:122:28
--> $DIR/default_numeric_fallback_i32.rs:109:28
|
LL | GenericStruct { x: 1 };
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:125:36
--> $DIR/default_numeric_fallback_i32.rs:112:36
|
LL | let _ = GenericStruct { x: 1 };
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:147:24
--> $DIR/default_numeric_fallback_i32.rs:130:24
|
LL | GenericEnum::X(1);
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:150:24
|
LL | GenericEnum::X(1.);
| ^^ help: consider adding suffix: `1._f64`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:170:23
--> $DIR/default_numeric_fallback_i32.rs:150:23
|
LL | s.generic_arg(1);
| ^ help: consider adding suffix: `1_i32`
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:177:21
--> $DIR/default_numeric_fallback_i32.rs:157:21
|
LL | let x = 22;
| ^^ help: consider adding suffix: `22_i32`
@ -173,5 +155,5 @@ LL | internal_macro!();
|
= note: this error originates in the macro `internal_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 28 previous errors
error: aborting due to 25 previous errors