Skip to content

Commit 734a8e6

Browse files
authored
Rollup merge of rust-lang#94354 - light4:issue-94239, r=Dylan-DPC
Fix show error message when literal overflows in match patterns Fix rust-lang#94239 This changes overflow behavior in [fn lit_to_const](https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir_build/src/thir/constant.rs#L10)
2 parents 3b1fe7e + b0c4db3 commit 734a8e6

File tree

5 files changed

+32
-7
lines changed

5 files changed

+32
-7
lines changed

compiler/rustc_mir_build/src/thir/constant.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ crate fn lit_to_const<'tcx>(
1717
let param_ty = ParamEnv::reveal_all().and(ty);
1818
let width = tcx.layout_of(param_ty).map_err(|_| LitToConstError::Reported)?.size;
1919
trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits());
20-
let result = width.truncate(n);
20+
let result = match &ty.kind() {
21+
ty::Uint(_) => {
22+
let max_value = width.unsigned_int_max();
23+
if n >= max_value { max_value } else { width.truncate(n) }
24+
}
25+
_ => width.truncate(n),
26+
};
2127
trace!("trunc result: {}", result);
2228
Ok(ConstValue::Scalar(Scalar::from_uint(result, width)))
2329
};

src/test/ui/error-codes/E0081.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ enum Enum {
1010
#[repr(u8)]
1111
enum EnumOverflowRepr {
1212
P = 257,
13-
//~^ NOTE first use of `1` (overflowed from `257`)
13+
//~^ NOTE first use of `255` (overflowed from `257`)
1414
X = 513,
15-
//~^ ERROR discriminant value `1` already exists
16-
//~| NOTE enum already has `1` (overflowed from `513`)
15+
//~^ ERROR discriminant value `255` already exists
16+
//~| NOTE enum already has `255` (overflowed from `513`)
1717
}
1818

1919
fn main() {

src/test/ui/error-codes/E0081.stderr

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ LL |
77
LL | X = 3,
88
| ^ enum already has `3`
99

10-
error[E0081]: discriminant value `1` already exists
10+
error[E0081]: discriminant value `255` already exists
1111
--> $DIR/E0081.rs:14:9
1212
|
1313
LL | P = 257,
14-
| --- first use of `1` (overflowed from `257`)
14+
| --- first use of `255` (overflowed from `257`)
1515
LL |
1616
LL | X = 513,
17-
| ^^^ enum already has `1` (overflowed from `513`)
17+
| ^^^ enum already has `255` (overflowed from `513`)
1818

1919
error: aborting due to 2 previous errors
2020

src/test/ui/issues/issue-94239.rs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
pub const fn test_match_range(len: u64) -> u64 {
2+
match len {
3+
10000000000000000000..=99999999999999999999 => 0, //~ ERROR literal out of range for `u64`
4+
_ => unreachable!(),
5+
}
6+
}
7+
8+
fn main() {}

src/test/ui/issues/issue-94239.stderr

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error: literal out of range for `u64`
2+
--> $DIR/issue-94239.rs:3:32
3+
|
4+
LL | 10000000000000000000..=99999999999999999999 => 0,
5+
| ^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= note: `#[deny(overflowing_literals)]` on by default
8+
= note: the literal `99999999999999999999` does not fit into the type `u64` whose range is `0..=18446744073709551615`
9+
10+
error: aborting due to previous error
11+

0 commit comments

Comments
 (0)