diff --git a/compiler/rustc_mir_build/src/thir/constant.rs b/compiler/rustc_mir_build/src/thir/constant.rs index 72c0985a63c33..a94c2b9f5f7d4 100644 --- a/compiler/rustc_mir_build/src/thir/constant.rs +++ b/compiler/rustc_mir_build/src/thir/constant.rs @@ -17,7 +17,13 @@ crate fn lit_to_const<'tcx>( let param_ty = ParamEnv::reveal_all().and(ty); let width = tcx.layout_of(param_ty).map_err(|_| LitToConstError::Reported)?.size; trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits()); - let result = width.truncate(n); + let result = match &ty.kind() { + ty::Uint(_) => { + let max_value = width.unsigned_int_max(); + if n >= max_value { max_value } else { width.truncate(n) } + } + _ => width.truncate(n), + }; trace!("trunc result: {}", result); Ok(ConstValue::Scalar(Scalar::from_uint(result, width))) }; diff --git a/src/test/ui/error-codes/E0081.rs b/src/test/ui/error-codes/E0081.rs index 255e05ced19f7..6f15b9d2ef95c 100644 --- a/src/test/ui/error-codes/E0081.rs +++ b/src/test/ui/error-codes/E0081.rs @@ -10,10 +10,10 @@ enum Enum { #[repr(u8)] enum EnumOverflowRepr { P = 257, - //~^ NOTE first use of `1` (overflowed from `257`) + //~^ NOTE first use of `255` (overflowed from `257`) X = 513, - //~^ ERROR discriminant value `1` already exists - //~| NOTE enum already has `1` (overflowed from `513`) + //~^ ERROR discriminant value `255` already exists + //~| NOTE enum already has `255` (overflowed from `513`) } fn main() { diff --git a/src/test/ui/error-codes/E0081.stderr b/src/test/ui/error-codes/E0081.stderr index 9b279bb0214c6..68bb0f407b82f 100644 --- a/src/test/ui/error-codes/E0081.stderr +++ b/src/test/ui/error-codes/E0081.stderr @@ -7,14 +7,14 @@ LL | LL | X = 3, | ^ enum already has `3` -error[E0081]: discriminant value `1` already exists +error[E0081]: discriminant value `255` already exists --> $DIR/E0081.rs:14:9 | LL | P = 257, - | --- first use of `1` (overflowed from `257`) + | --- first use of `255` (overflowed from `257`) LL | LL | X = 513, - | ^^^ enum already has `1` (overflowed from `513`) + | ^^^ enum already has `255` (overflowed from `513`) error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-94239.rs b/src/test/ui/issues/issue-94239.rs new file mode 100644 index 0000000000000..a09ae32aa74d6 --- /dev/null +++ b/src/test/ui/issues/issue-94239.rs @@ -0,0 +1,8 @@ +pub const fn test_match_range(len: u64) -> u64 { + match len { + 10000000000000000000..=99999999999999999999 => 0, //~ ERROR literal out of range for `u64` + _ => unreachable!(), + } +} + +fn main() {} diff --git a/src/test/ui/issues/issue-94239.stderr b/src/test/ui/issues/issue-94239.stderr new file mode 100644 index 0000000000000..057fbfec64f9b --- /dev/null +++ b/src/test/ui/issues/issue-94239.stderr @@ -0,0 +1,11 @@ +error: literal out of range for `u64` + --> $DIR/issue-94239.rs:3:32 + | +LL | 10000000000000000000..=99999999999999999999 => 0, + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[deny(overflowing_literals)]` on by default + = note: the literal `99999999999999999999` does not fit into the type `u64` whose range is `0..=18446744073709551615` + +error: aborting due to previous error +