Handle index out of bound errors during const eval without panic
This commit is contained in:
parent
24ddd16154
commit
ef6240a3e3
@ -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) => {
|
||||
|
6
src/test/ui/consts/array-literal-index-oob.rs
Normal file
6
src/test/ui/consts/array-literal-index-oob.rs
Normal file
@ -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
|
||||
}
|
24
src/test/ui/consts/array-literal-index-oob.stderr
Normal file
24
src/test/ui/consts/array-literal-index-oob.stderr
Normal file
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user