@@ -566,14 +566,29 @@ impl<T> ops::IndexMut<usize> for [T] {
566
566
}
567
567
}
568
568
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
+
569
581
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
570
582
impl < T > ops:: Index < ops:: Range < usize > > for [ T ] {
571
583
type Output = [ T ] ;
572
584
573
585
#[ inline]
574
586
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
+ }
577
592
unsafe {
578
593
from_raw_parts (
579
594
self . as_ptr ( ) . offset ( index. start as isize ) ,
@@ -614,8 +629,11 @@ impl<T> ops::Index<RangeFull> for [T] {
614
629
impl < T > ops:: IndexMut < ops:: Range < usize > > for [ T ] {
615
630
#[ inline]
616
631
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
+ }
619
637
unsafe {
620
638
from_raw_parts_mut (
621
639
self . as_mut_ptr ( ) . offset ( index. start as isize ) ,
0 commit comments