diff --git a/compiler/rustc_mir_transform/src/known_panics_lint.rs b/compiler/rustc_mir_transform/src/known_panics_lint.rs index 38fc37a3a3131..baa25a10a6e89 100644 --- a/compiler/rustc_mir_transform/src/known_panics_lint.rs +++ b/compiler/rustc_mir_transform/src/known_panics_lint.rs @@ -102,8 +102,14 @@ impl<'tcx> Value<'tcx> { } (PlaceElem::Index(idx), Value::Aggregate { fields, .. }) => { let idx = prop.get_const(idx.into())?.immediate()?; - let idx = prop.ecx.read_target_usize(idx).ok()?; - fields.get(FieldIdx::from_u32(idx.try_into().ok()?)).unwrap_or(&Value::Uninit) + let idx: u32 = prop.ecx.read_target_usize(idx).ok()?.try_into().ok()?; + + let max: u32 = FieldIdx::MAX.index().try_into().ok()?; + if idx > max { + return None; + } + + fields.get(FieldIdx::from_u32(idx)).unwrap_or(&Value::Uninit) } ( PlaceElem::ConstantIndex { offset, min_length: _, from_end: false }, diff --git a/tests/ui/indexing/index-out-of-bounds-exceeds-max-value-issue-121126.rs b/tests/ui/indexing/index-out-of-bounds-exceeds-max-value-issue-121126.rs new file mode 100644 index 0000000000000..7750993f1e20a --- /dev/null +++ b/tests/ui/indexing/index-out-of-bounds-exceeds-max-value-issue-121126.rs @@ -0,0 +1,13 @@ +// Regression test for #121126. Compiler was panicking when indexing an array +// with an index that is out of bounds and its value is greater than the max +// value allowed for an index. + +//@ build-fail + +fn main() { + [0][0xFFFF_FF01]; +//~^ ERROR this operation will panic at runtime [unconditional_panic] +} + +// NOTE: In order for the test to be valid, the index can take on any value +// between FieldIdx::MAX + 1 (= 0xFFF_FF01) and u32::MAX (= 0xFFF_FFFF) diff --git a/tests/ui/indexing/index-out-of-bounds-exceeds-max-value-issue-121126.stderr b/tests/ui/indexing/index-out-of-bounds-exceeds-max-value-issue-121126.stderr new file mode 100644 index 0000000000000..e530a994b14c3 --- /dev/null +++ b/tests/ui/indexing/index-out-of-bounds-exceeds-max-value-issue-121126.stderr @@ -0,0 +1,10 @@ +error: this operation will panic at runtime + --> $DIR/issue-121126-index-out-of-bounds-exceeds-max-value.rs:8:5 + | +LL | [0][0xFFFF_FF01]; + | ^^^^^^^^^^^^^^^^ index out of bounds: the length is 1 but the index is 4294967041 + | + = note: `#[deny(unconditional_panic)]` on by default + +error: aborting due to 1 previous error +