Files
rust/src/test/ui
Manish Goregaokar b285d68f36 Rollup merge of #73334 - ayazhafiz:err/num-type-cannot-fit, r=estebank
Note numeric literals that can never fit in an expected type

re https://github.com/rust-lang/rust/pull/72380#discussion_r438289385

Given the toy code

```rust
fn is_positive(n: usize) {
  n > -1_isize;
}
```

We currently get a type mismatch error like the following:

```
error[E0308]: mismatched types
 --> src/main.rs:2:9
  |
2 |     n > -1_isize;
  |         ^^^^^^^^ expected `usize`, found `isize`
  |
help: you can convert an `isize` to `usize` and panic if the converted value wouldn't fit
  |
2 |     n > (-1_isize).try_into().unwrap();
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

But clearly, `-1` can never fit into a `usize`, so the suggestion will
always panic. A more useful message would tell the user that the value
can never fit in the expected type:

```
error[E0308]: mismatched types
 --> test.rs:2:9
  |
2 |     n > -1_isize;
  |         ^^^^^^^^ expected `usize`, found `isize`
  |
note: `-1_isize` can never fit into `usize`
 --> test.rs:2:9
  |
2 |     n > -1_isize;
  |         ^^^^^^^^
```

Which is what this commit implements.

I only added this check for negative literals because

- Currently we can only perform such a check for literals (constant
  value propagation is outside the scope of the typechecker at this
  point)
- A lint error for out-of-range numeric literals is already emitted

IMO it makes more sense to put this check in librustc_lint, but as far
as I can tell the typecheck pass happens before the lint pass, so I've
added it here.

r? @estebank
2020-06-19 09:15:10 -07:00
..
2020-05-09 14:40:17 +02:00
2020-04-24 00:22:50 +02:00
2020-06-15 08:57:20 -07:00
2020-06-15 08:57:20 -07:00
2020-04-23 15:46:05 +08:00
2020-05-20 16:08:09 +02:00
2020-05-07 02:22:08 +09:00
2020-05-26 23:06:46 +03:00
2020-05-26 21:49:55 -04:00
2020-05-08 00:39:02 +09:00
2020-06-08 14:58:37 -07:00
2020-04-22 12:42:02 -07:00
2020-05-08 00:39:02 +09:00
2020-05-08 00:39:02 +09:00
2020-05-09 14:40:17 +02:00
2020-05-08 00:39:02 +09:00
2020-05-09 14:40:17 +02:00
2020-04-17 06:16:14 +09:00
2020-05-30 13:55:25 +02:00
2020-05-08 00:39:02 +09:00
2020-05-26 21:49:55 -04:00
2020-05-28 16:50:10 +09:00
2020-04-16 14:05:57 +02:00
2020-06-08 12:00:12 +01:00
2020-05-08 00:39:02 +09:00
2020-05-08 00:39:02 +09:00
2020-05-08 00:39:02 +09:00
2020-05-08 00:39:02 +09:00
2020-05-09 14:40:17 +02:00
2020-05-09 14:40:17 +02:00
2020-05-01 17:32:06 +02:00
2020-06-10 01:35:47 +00:00
2020-05-08 00:39:02 +09:00
2020-05-08 00:39:02 +09:00
2020-05-08 00:39:02 +09:00
2020-06-15 21:28:50 -07:00
2020-05-09 14:40:17 +02:00
2020-05-09 14:40:17 +02:00
2020-05-26 11:16:02 +02:00
2020-05-08 00:39:02 +09:00
2020-05-20 16:08:09 +02:00
2020-06-07 14:57:57 +02:00