New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix FP in `fn_to_numeric_cast_with_truncation` #3279

Merged
merged 1 commit into from Oct 7, 2018
Jump to file or symbol
Failed to load files and symbols.
+33 −24
Diff settings

Always

Just for now

@@ -1088,6 +1088,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CastPass {
}
fn lint_fn_to_numeric_cast(cx: &LateContext<'_, '_>, expr: &Expr, cast_expr: &Expr, cast_from: Ty<'_>, cast_to: Ty<'_>) {
// We only want to check casts to `ty::Uint` or `ty::Int`
match cast_to.sty {
ty::Uint(_) | ty::Int(..) => { /* continue on */ },
_ => return
}
match cast_from.sty {
ty::FnDef(..) | ty::FnPtr(_) => {
let from_snippet = snippet(cx, cast_expr.span, "x");
@@ -31,6 +31,10 @@ fn test_function_to_numeric_cast() {
// Casting to usize is OK and should not warn
let _ = foo as usize;
// Cast `f` (a `FnDef`) to `fn()` should not warn
fn f() {}
let _ = f as fn();
}
fn test_function_var_to_numeric_cast() {
@@ -69,75 +69,75 @@ error: casting function pointer `foo` to `u128`
| ^^^^^^^^^^^ help: try: `foo as usize`
error: casting function pointer `abc` to `i8`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:39:13
--> $DIR/fn_to_numeric_cast.rs:43:13
|
39 | let _ = abc as i8;
43 | let _ = abc as i8;
| ^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `i16`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:40:13
--> $DIR/fn_to_numeric_cast.rs:44:13
|
40 | let _ = abc as i16;
44 | let _ = abc as i16;
| ^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `i32`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:41:13
--> $DIR/fn_to_numeric_cast.rs:45:13
|
41 | let _ = abc as i32;
45 | let _ = abc as i32;
| ^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `i64`
--> $DIR/fn_to_numeric_cast.rs:42:13
--> $DIR/fn_to_numeric_cast.rs:46:13
|
42 | let _ = abc as i64;
46 | let _ = abc as i64;
| ^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `i128`
--> $DIR/fn_to_numeric_cast.rs:43:13
--> $DIR/fn_to_numeric_cast.rs:47:13
|
43 | let _ = abc as i128;
47 | let _ = abc as i128;
| ^^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `isize`
--> $DIR/fn_to_numeric_cast.rs:44:13
--> $DIR/fn_to_numeric_cast.rs:48:13
|
44 | let _ = abc as isize;
48 | let _ = abc as isize;
| ^^^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `u8`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:46:13
--> $DIR/fn_to_numeric_cast.rs:50:13
|
46 | let _ = abc as u8;
50 | let _ = abc as u8;
| ^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `u16`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:47:13
--> $DIR/fn_to_numeric_cast.rs:51:13
|
47 | let _ = abc as u16;
51 | let _ = abc as u16;
| ^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `u32`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:48:13
--> $DIR/fn_to_numeric_cast.rs:52:13
|
48 | let _ = abc as u32;
52 | let _ = abc as u32;
| ^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `u64`
--> $DIR/fn_to_numeric_cast.rs:49:13
--> $DIR/fn_to_numeric_cast.rs:53:13
|
49 | let _ = abc as u64;
53 | let _ = abc as u64;
| ^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `abc` to `u128`
--> $DIR/fn_to_numeric_cast.rs:50:13
--> $DIR/fn_to_numeric_cast.rs:54:13
|
50 | let _ = abc as u128;
54 | let _ = abc as u128;
| ^^^^^^^^^^^ help: try: `abc as usize`
error: casting function pointer `f` to `i32`, which truncates the value
--> $DIR/fn_to_numeric_cast.rs:57:5
--> $DIR/fn_to_numeric_cast.rs:61:5
|
57 | f as i32
61 | f as i32
| ^^^^^^^^ help: try: `f as usize`
error: aborting due to 23 previous errors
ProTip! Use n and p to navigate between commits in a pull request.