Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22621 from shulaoda/06-20-fix_don_t_panic_on_out-of-range_integer_literals_in_const_positions
fix: Don't panic on out-of-range integer literals in const positions
Lukas Wirth 4 weeks ago
parent 501826b · parent d4f9db0 · commit 688ddb7
-rw-r--r--crates/hir-ty/src/consteval.rs16
-rw-r--r--crates/hir-ty/src/tests/regression/new_solver.rs10
2 files changed, 22 insertions, 4 deletions
diff --git a/crates/hir-ty/src/consteval.rs b/crates/hir-ty/src/consteval.rs
index d6580d3752..a880ae5353 100644
--- a/crates/hir-ty/src/consteval.rs
+++ b/crates/hir-ty/src/consteval.rs
@@ -87,18 +87,24 @@ fn intern_const_ref<'db>(
let valtree = match (ty.kind(), value) {
(TyKind::Uint(uint), Literal::Uint(value, _)) => {
let size = uint.bit_width().map(Size::from_bits).unwrap_or(data_layout.pointer_size());
- let scalar = ScalarInt::try_from_uint(*value, size).unwrap();
+ let Some(scalar) = ScalarInt::try_from_uint(*value, size) else {
+ return Ok(Const::error(interner));
+ };
ValTreeKind::Leaf(scalar)
}
(TyKind::Uint(uint), Literal::Int(value, _)) => {
// `Literal::Int` is the default, so we also need to account for the type being uint.
let size = uint.bit_width().map(Size::from_bits).unwrap_or(data_layout.pointer_size());
- let scalar = ScalarInt::try_from_uint(*value as u128, size).unwrap();
+ let Some(scalar) = ScalarInt::try_from_uint(*value as u128, size) else {
+ return Ok(Const::error(interner));
+ };
ValTreeKind::Leaf(scalar)
}
(TyKind::Int(int), Literal::Int(value, _)) => {
let size = int.bit_width().map(Size::from_bits).unwrap_or(data_layout.pointer_size());
- let scalar = ScalarInt::try_from_int(*value, size).unwrap();
+ let Some(scalar) = ScalarInt::try_from_int(*value, size) else {
+ return Ok(Const::error(interner));
+ };
ValTreeKind::Leaf(scalar)
}
(TyKind::Bool, Literal::Bool(value)) => ValTreeKind::Leaf(ScalarInt::from(*value)),
@@ -219,7 +225,9 @@ pub fn usize_const<'db>(db: &'db dyn HirDatabase, value: Option<u128>, krate: Cr
return Const::error(interner);
};
let usize_ty = interner.default_types().types.usize;
- let scalar = ScalarInt::try_from_uint(value, data_layout.pointer_size()).unwrap();
+ let Some(scalar) = ScalarInt::try_from_uint(value, data_layout.pointer_size()) else {
+ return Const::error(interner);
+ };
Const::new_valtree(interner, usize_ty, ValTreeKind::Leaf(scalar))
}
diff --git a/crates/hir-ty/src/tests/regression/new_solver.rs b/crates/hir-ty/src/tests/regression/new_solver.rs
index 17127b2771..fb00a755fa 100644
--- a/crates/hir-ty/src/tests/regression/new_solver.rs
+++ b/crates/hir-ty/src/tests/regression/new_solver.rs
@@ -405,6 +405,16 @@ const A: [u8; S] = [0; 8];
}
#[test]
+fn oversized_array_len_does_not_panic() {
+ // The array length literal does not fit in `usize`; interning it must not panic.
+ check_no_mismatches(
+ r#"
+fn f(_: [u8; 18446744073709551616]) {}
+ "#,
+ );
+}
+
+#[test]
fn another_20654_case() {
check_no_mismatches(
r#"