Merge pull request #2814 from VKlayd/fn_to_int

WIP: Add lint on cast Fn to all numerical except usize.
This commit is contained in:
Oliver Schneider 2018-06-05 17:08:33 +02:00 committed by GitHub
commit 1e1b4e26ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 158 additions and 1 deletions

View file

@ -0,0 +1,22 @@
enum Foo {
A(usize),
B
}
fn bar() -> i32 {
0i32
}
fn main() {
let x = Foo::A;
let _y = x as i32;
let _y1 = Foo::A as i32;
let _y = x as u32;
let _z = bar as u32;
let _y = bar as i64;
let _y = bar as u64;
let _z = Foo::A as i128;
let _z = Foo::A as u128;
let _z = bar as i128;
let _z = bar as u128;
}

View file

@ -0,0 +1,66 @@
error: casting a `fn(usize) -> Foo {Foo::A}` to `i32` may truncate the function address value.
--> $DIR/types_fn_to_int.rs:12:14
|
12 | let _y = x as i32;
| ^^^^^^^^ help: if you need the address of the function, consider: `x as usize`
|
= note: #[deny(fn_to_numeric_cast_with_truncation)] on by default
error: casting a `fn(usize) -> Foo {Foo::A}` to `i32` may truncate the function address value.
--> $DIR/types_fn_to_int.rs:13:15
|
13 | let _y1 = Foo::A as i32;
| ^^^^^^^^^^^^^ help: if you need the address of the function, consider: `Foo::A as usize`
error: casting a `fn(usize) -> Foo {Foo::A}` to `u32` may truncate the function address value.
--> $DIR/types_fn_to_int.rs:14:14
|
14 | let _y = x as u32;
| ^^^^^^^^ help: if you need the address of the function, consider: `x as usize`
error: casting a `fn() -> i32 {bar}` to `u32` may truncate the function address value.
--> $DIR/types_fn_to_int.rs:15:14
|
15 | let _z = bar as u32;
| ^^^^^^^^^^ help: if you need the address of the function, consider: `bar as usize`
error: casting a `fn() -> i32 {bar}` to `i64` may truncate the function address value.
--> $DIR/types_fn_to_int.rs:16:14
|
16 | let _y = bar as i64;
| ^^^^^^^^^^ help: if you need the address of the function, consider: `bar as usize`
error: casting a `fn() -> i32 {bar}` to `u64` is bad style.
--> $DIR/types_fn_to_int.rs:17:14
|
17 | let _y = bar as u64;
| ^^^^^^^^^^ help: if you need the address of the function, consider: `bar as usize`
|
= note: `-D fn-to-numeric-cast` implied by `-D warnings`
error: casting a `fn(usize) -> Foo {Foo::A}` to `i128` is bad style.
--> $DIR/types_fn_to_int.rs:18:14
|
18 | let _z = Foo::A as i128;
| ^^^^^^^^^^^^^^ help: if you need the address of the function, consider: `Foo::A as usize`
error: casting a `fn(usize) -> Foo {Foo::A}` to `u128` is bad style.
--> $DIR/types_fn_to_int.rs:19:14
|
19 | let _z = Foo::A as u128;
| ^^^^^^^^^^^^^^ help: if you need the address of the function, consider: `Foo::A as usize`
error: casting a `fn() -> i32 {bar}` to `i128` is bad style.
--> $DIR/types_fn_to_int.rs:20:14
|
20 | let _z = bar as i128;
| ^^^^^^^^^^^ help: if you need the address of the function, consider: `bar as usize`
error: casting a `fn() -> i32 {bar}` to `u128` is bad style.
--> $DIR/types_fn_to_int.rs:21:14
|
21 | let _z = bar as u128;
| ^^^^^^^^^^^ help: if you need the address of the function, consider: `bar as usize`
error: aborting due to 10 previous errors