diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index b8bb54815d8bf..eef0940a8e48d 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -348,8 +348,12 @@ where offsets[usize::try_from(field).unwrap()], layout::FieldPlacement::Array { stride, .. } => { let len = base.len(self)?; - assert!(field < len, "Tried to access element {} of array/slice with length {}", - field, len); + if field >= len { + // This can be violated because this runs during promotion on code where the + // type system has not yet ensured that such things don't happen. + debug!("Tried to access element {} of array/slice with length {}", field, len); + return err!(BoundsCheck { len, index: field }); + } stride * field } layout::FieldPlacement::Union(count) => { diff --git a/src/test/ui/consts/array-literal-index-oob.rs b/src/test/ui/consts/array-literal-index-oob.rs new file mode 100644 index 0000000000000..76013c77de0c2 --- /dev/null +++ b/src/test/ui/consts/array-literal-index-oob.rs @@ -0,0 +1,6 @@ +fn main() { + &{[1, 2, 3][4]}; + //~^ ERROR index out of bounds + //~| ERROR reaching this expression at runtime will panic or abort + //~| ERROR this expression will panic at runtime +} diff --git a/src/test/ui/consts/array-literal-index-oob.stderr b/src/test/ui/consts/array-literal-index-oob.stderr new file mode 100644 index 0000000000000..727ce9e57a47b --- /dev/null +++ b/src/test/ui/consts/array-literal-index-oob.stderr @@ -0,0 +1,24 @@ +error: index out of bounds: the len is 3 but the index is 4 + --> $DIR/array-literal-index-oob.rs:2:7 + | +LL | &{[1, 2, 3][4]}; + | ^^^^^^^^^^^^ + | + = note: #[deny(const_err)] on by default + +error: this expression will panic at runtime + --> $DIR/array-literal-index-oob.rs:2:5 + | +LL | &{[1, 2, 3][4]}; + | ^^^^^^^^^^^^^^^ index out of bounds: the len is 3 but the index is 4 + +error: reaching this expression at runtime will panic or abort + --> $DIR/array-literal-index-oob.rs:2:7 + | +LL | &{[1, 2, 3][4]}; + | --^^^^^^^^^^^^- + | | + | index out of bounds: the len is 3 but the index is 4 + +error: aborting due to 3 previous errors +