Skip to content

Commit 5c873be

Browse files
committed
Improve slice indexing assertion
1 parent c0f9a39 commit 5c873be

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

src/libcore/slice.rs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -566,14 +566,29 @@ impl<T> ops::IndexMut<usize> for [T] {
566566
}
567567
}
568568

569+
#[inline(never)]
570+
#[cold]
571+
fn slice_index_len_fail(index: usize, len: usize) -> ! {
572+
panic!("index {} out of range for slice of length {}", index, len);
573+
}
574+
575+
#[inline(never)]
576+
#[cold]
577+
fn slice_index_order_fail(index: usize, end: usize) -> ! {
578+
panic!("slice index starts at {} but ends at {}", index, end);
579+
}
580+
569581
#[stable(feature = "rust1", since = "1.0.0")]
570582
impl<T> ops::Index<ops::Range<usize>> for [T] {
571583
type Output = [T];
572584

573585
#[inline]
574586
fn index(&self, index: ops::Range<usize>) -> &[T] {
575-
assert!(index.start <= index.end);
576-
assert!(index.end <= self.len());
587+
if index.start > index.end {
588+
slice_index_order_fail(index.start, index.end);
589+
} else if index.end > self.len() {
590+
slice_index_len_fail(index.end, self.len());
591+
}
577592
unsafe {
578593
from_raw_parts (
579594
self.as_ptr().offset(index.start as isize),
@@ -614,8 +629,11 @@ impl<T> ops::Index<RangeFull> for [T] {
614629
impl<T> ops::IndexMut<ops::Range<usize>> for [T] {
615630
#[inline]
616631
fn index_mut(&mut self, index: ops::Range<usize>) -> &mut [T] {
617-
assert!(index.start <= index.end);
618-
assert!(index.end <= self.len());
632+
if index.start > index.end {
633+
slice_index_order_fail(index.start, index.end);
634+
} else if index.end > self.len() {
635+
slice_index_len_fail(index.end, self.len());
636+
}
619637
unsafe {
620638
from_raw_parts_mut(
621639
self.as_mut_ptr().offset(index.start as isize),

0 commit comments

Comments
 (0)