Skip to content

Commit

Permalink
Suggest into instead of try_into if possible with int types
Browse files Browse the repository at this point in the history
If it is possible to convert an integer type into another using
`into`, don't suggest `try_into`. This commit changes the suggested
method to convert from one integer type to another for the following
cases:

- u{n} -> i{m} where n < m
- u8 -> isize
- i{n} -> isize where n <= 16
- u{n} -> usize where n <= 16
  • Loading branch information
samrat committed Apr 27, 2020
1 parent 46ec74e commit 1f0a864
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/librustc_typeck/check/demand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
suggest_to_change_suffix_or_into(err, is_fallible);
true
}
(&ty::Int(_), &ty::Uint(_)) | (&ty::Uint(_), &ty::Int(_)) => {
(&ty::Int(exp), &ty::Uint(found)) => {
let is_fallible = match (exp.bit_width(), found.bit_width()) {
(Some(exp), Some(found)) if found < exp => false,
(None, Some(found)) if found <= 16 => false,
_ => true
};
suggest_to_change_suffix_or_into(err, is_fallible);
true
},
(&ty::Uint(_), &ty::Int(_)) => {
suggest_to_change_suffix_or_into(err, true);
true
}
Expand Down
17 changes: 17 additions & 0 deletions src/test/ui/suggestions/integer-into.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
fn main() {
let a = 1u8;
let _: i64 = a;
//~^ ERROR mismatched types

let b = 1i8;
let _: isize = b;
//~^ ERROR mismatched types

let c = 1u8;
let _: isize = c;
//~^ ERROR mismatched types

let d = 1u8;
let _: usize = d;
//~^ ERROR mismatched types
}
43 changes: 43 additions & 0 deletions src/test/ui/suggestions/integer-into.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
error[E0308]: mismatched types
--> $DIR/integer-into.rs:3:18
|
LL | let _: i64 = a;
| --- ^
| | |
| | expected `i64`, found `u8`
| | help: you can convert an `u8` to `i64`: `a.into()`
| expected due to this

error[E0308]: mismatched types
--> $DIR/integer-into.rs:7:20
|
LL | let _: isize = b;
| ----- ^
| | |
| | expected `isize`, found `i8`
| | help: you can convert an `i8` to `isize`: `b.into()`
| expected due to this

error[E0308]: mismatched types
--> $DIR/integer-into.rs:11:20
|
LL | let _: isize = c;
| ----- ^
| | |
| | expected `isize`, found `u8`
| | help: you can convert an `u8` to `isize`: `c.into()`
| expected due to this

error[E0308]: mismatched types
--> $DIR/integer-into.rs:15:20
|
LL | let _: usize = d;
| ----- ^
| | |
| | expected `usize`, found `u8`
| | help: you can convert an `u8` to `usize`: `d.into()`
| expected due to this

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 1f0a864

Please sign in to comment.