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),