Skip to content

Commit

Permalink
Handle index out of bound errors during const eval without panic
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Jun 12, 2019
1 parent 24ddd16 commit ef6240a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/librustc_mir/interpret/place.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/consts/array-literal-index-oob.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 24 additions & 0 deletions src/test/ui/consts/array-literal-index-oob.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ef6240a

Please sign in to comment.