diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2015-11-22 18:44:37 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2015-11-23 09:39:46 +0530 |
| commit | 5c873be9c323f15f102720fe9085e2c4e982bb6d (patch) | |
| tree | 19069d321998941841a2e5cf231f2a3d1a43bc58 /src/libcore/slice.rs | |
| parent | c0f9a39e5ca3530c0d3a639ba068d4264de904c7 (diff) | |
| download | rust-5c873be9c323f15f102720fe9085e2c4e982bb6d.tar.gz rust-5c873be9c323f15f102720fe9085e2c4e982bb6d.zip | |
Improve slice indexing assertion
Diffstat (limited to 'src/libcore/slice.rs')
| -rw-r--r-- | src/libcore/slice.rs | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index efb782fece8..890ca43580b 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -566,14 +566,29 @@ impl<T> ops::IndexMut<usize> for [T] { } } +#[inline(never)] +#[cold] +fn slice_index_len_fail(index: usize, len: usize) -> ! { + panic!("index {} out of range for slice of length {}", index, len); +} + +#[inline(never)] +#[cold] +fn slice_index_order_fail(index: usize, end: usize) -> ! { + panic!("slice index starts at {} but ends at {}", index, end); +} + #[stable(feature = "rust1", since = "1.0.0")] impl<T> ops::Index<ops::Range<usize>> for [T] { type Output = [T]; #[inline] fn index(&self, index: ops::Range<usize>) -> &[T] { - assert!(index.start <= index.end); - assert!(index.end <= self.len()); + if index.start > index.end { + slice_index_order_fail(index.start, index.end); + } else if index.end > self.len() { + slice_index_len_fail(index.end, self.len()); + } unsafe { from_raw_parts ( self.as_ptr().offset(index.start as isize), @@ -614,8 +629,11 @@ impl<T> ops::Index<RangeFull> for [T] { impl<T> ops::IndexMut<ops::Range<usize>> for [T] { #[inline] fn index_mut(&mut self, index: ops::Range<usize>) -> &mut [T] { - assert!(index.start <= index.end); - assert!(index.end <= self.len()); + if index.start > index.end { + slice_index_order_fail(index.start, index.end); + } else if index.end > self.len() { + slice_index_len_fail(index.end, self.len()); + } unsafe { from_raw_parts_mut( self.as_mut_ptr().offset(index.start as isize), |
