]> git.lizzy.rs Git - rust.git/commitdiff
Suggest `into` instead of `try_into` if possible with int types
authorSamrat Man Singh <samratmansingh@gmail.com>
Mon, 27 Apr 2020 18:43:37 +0000 (00:13 +0530)
committerSamrat Man Singh <samratmansingh@gmail.com>
Mon, 27 Apr 2020 19:13:20 +0000 (00:43 +0530)
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

src/librustc_typeck/check/demand.rs
src/test/ui/suggestions/integer-into.rs [new file with mode: 0644]
src/test/ui/suggestions/integer-into.stderr [new file with mode: 0644]

index c75283e419a6d5da928552e1c75a46afbcecfaa1..980aefa710ff597b986fd36963bfbcaa37027438 100644 (file)
@@ -767,7 +767,16 @@ pub fn check_for_cast(
                     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
                 }
diff --git a/src/test/ui/suggestions/integer-into.rs b/src/test/ui/suggestions/integer-into.rs
new file mode 100644 (file)
index 0000000..409b27a
--- /dev/null
@@ -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
+}
diff --git a/src/test/ui/suggestions/integer-into.stderr b/src/test/ui/suggestions/integer-into.stderr
new file mode 100644 (file)
index 0000000..a15cf81
--- /dev/null
@@ -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`.