@@ -34,36 +34,41 @@ where
3434#[ cfg_attr( not( feature = "panic_immediate_abort" ) ,  inline( never) ,  cold) ]  
3535#[ cfg_attr( feature = "panic_immediate_abort" ,  inline) ]  
3636#[ track_caller]  
37- const  fn  slice_start_index_len_fail ( index :  usize ,  len :  usize )  -> ! { 
38-     const_panic ! ( 
39-         "slice start index is out of range for slice" , 
40-         "range start index {index} out of range for slice of length {len}" , 
41-         index:  usize , 
42-         len:  usize , 
43-     ) 
44- } 
45- 
46- #[ cfg_attr( not( feature = "panic_immediate_abort" ) ,  inline( never) ,  cold) ]  
47- #[ cfg_attr( feature = "panic_immediate_abort" ,  inline) ]  
48- #[ track_caller]  
49- const  fn  slice_end_index_len_fail ( index :  usize ,  len :  usize )  -> ! { 
37+ const  fn  slice_index_fail ( start :  usize ,  end :  usize ,  len :  usize )  -> ! { 
38+     if  start > len { 
39+         const_panic ! ( 
40+             "slice start index is out of range for slice" , 
41+             "range start index {start} out of range for slice of length {len}" , 
42+             start:  usize , 
43+             len:  usize , 
44+         ) 
45+     } 
46+ 
47+     if  end > len { 
48+         const_panic ! ( 
49+             "slice end index is out of range for slice" , 
50+             "range end index {end} out of range for slice of length {len}" , 
51+             end:  usize , 
52+             len:  usize , 
53+         ) 
54+     } 
55+ 
56+     if  start > end { 
57+         const_panic ! ( 
58+             "slice index start is larger than end" , 
59+             "slice index starts at {start} but ends at {end}" , 
60+             start:  usize , 
61+             end:  usize , 
62+         ) 
63+     } 
64+ 
65+     // Only reachable if the range was a `RangeInclusive` or a 
66+     // `RangeToInclusive`, with `end == len`. 
5067    const_panic ! ( 
5168        "slice end index is out of range for slice" , 
52-         "range end index {index} out of range for slice of length {len}" , 
53-         index:  usize , 
54-         len:  usize , 
55-     ) 
56- } 
57- 
58- #[ cfg_attr( not( feature = "panic_immediate_abort" ) ,  inline( never) ,  cold) ]  
59- #[ cfg_attr( feature = "panic_immediate_abort" ,  inline) ]  
60- #[ track_caller]  
61- const  fn  slice_index_order_fail ( index :  usize ,  end :  usize )  -> ! { 
62-     const_panic ! ( 
63-         "slice index start is larger than end" , 
64-         "slice index starts at {index} but ends at {end}" , 
65-         index:  usize , 
69+         "range end index {end} out of range for slice of length {len}" , 
6670        end:  usize , 
71+         len:  usize , 
6772    ) 
6873} 
6974
@@ -327,7 +332,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::IndexRange {
327332            // SAFETY: `self` is checked to be valid and in bounds above. 
328333            unsafe  {  & * get_offset_len_noubcheck ( slice,  self . start ( ) ,  self . len ( ) )  } 
329334        }  else  { 
330-             slice_end_index_len_fail ( self . end ( ) ,  slice. len ( ) ) 
335+             slice_index_fail ( self . start ( ) ,   self . end ( ) ,  slice. len ( ) ) 
331336        } 
332337    } 
333338
@@ -337,7 +342,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::IndexRange {
337342            // SAFETY: `self` is checked to be valid and in bounds above. 
338343            unsafe  {  & mut  * get_offset_len_mut_noubcheck ( slice,  self . start ( ) ,  self . len ( ) )  } 
339344        }  else  { 
340-             slice_end_index_len_fail ( self . end ( ) ,  slice. len ( ) ) 
345+             slice_index_fail ( self . start ( ) ,   self . end ( ) ,  slice. len ( ) ) 
341346        } 
342347    } 
343348} 
@@ -423,10 +428,10 @@ unsafe impl<T> const SliceIndex<[T]> for ops::Range<usize> {
423428    fn  index ( self ,  slice :  & [ T ] )  -> & [ T ]  { 
424429        // Using checked_sub is a safe way to get `SubUnchecked` in MIR 
425430        let  Some ( new_len)  = usize:: checked_sub ( self . end ,  self . start )  else  { 
426-             slice_index_order_fail ( self . start ,  self . end ) 
431+             slice_index_fail ( self . start ,  self . end ,  slice . len ( ) ) 
427432        } ; 
428433        if  self . end  > slice. len ( )  { 
429-             slice_end_index_len_fail ( self . end ,  slice. len ( ) ) ; 
434+             slice_index_fail ( self . start ,   self . end ,  slice. len ( ) ) 
430435        } 
431436        // SAFETY: `self` is checked to be valid and in bounds above. 
432437        unsafe  {  & * get_offset_len_noubcheck ( slice,  self . start ,  new_len)  } 
@@ -435,10 +440,10 @@ unsafe impl<T> const SliceIndex<[T]> for ops::Range<usize> {
435440    #[ inline]  
436441    fn  index_mut ( self ,  slice :  & mut  [ T ] )  -> & mut  [ T ]  { 
437442        let  Some ( new_len)  = usize:: checked_sub ( self . end ,  self . start )  else  { 
438-             slice_index_order_fail ( self . start ,  self . end ) 
443+             slice_index_fail ( self . start ,  self . end ,  slice . len ( ) ) 
439444        } ; 
440445        if  self . end  > slice. len ( )  { 
441-             slice_end_index_len_fail ( self . end ,  slice. len ( ) ) ; 
446+             slice_index_fail ( self . start ,   self . end ,  slice. len ( ) ) 
442447        } 
443448        // SAFETY: `self` is checked to be valid and in bounds above. 
444449        unsafe  {  & mut  * get_offset_len_mut_noubcheck ( slice,  self . start ,  new_len)  } 
@@ -553,7 +558,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeFrom<usize> {
553558    #[ inline]  
554559    fn  index ( self ,  slice :  & [ T ] )  -> & [ T ]  { 
555560        if  self . start  > slice. len ( )  { 
556-             slice_start_index_len_fail ( self . start ,  slice. len ( ) ) ; 
561+             slice_index_fail ( self . start ,  slice. len ( ) ,  slice . len ( ) ) 
557562        } 
558563        // SAFETY: `self` is checked to be valid and in bounds above. 
559564        unsafe  {  & * self . get_unchecked ( slice)  } 
@@ -562,7 +567,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeFrom<usize> {
562567    #[ inline]  
563568    fn  index_mut ( self ,  slice :  & mut  [ T ] )  -> & mut  [ T ]  { 
564569        if  self . start  > slice. len ( )  { 
565-             slice_start_index_len_fail ( self . start ,  slice. len ( ) ) ; 
570+             slice_index_fail ( self . start ,  slice. len ( ) ,  slice . len ( ) ) 
566571        } 
567572        // SAFETY: `self` is checked to be valid and in bounds above. 
568573        unsafe  {  & mut  * self . get_unchecked_mut ( slice)  } 
@@ -678,15 +683,15 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeInclusive<usize> {
678683    #[ inline]  
679684    fn  index ( self ,  slice :  & [ T ] )  -> & [ T ]  { 
680685        if  * self . end ( )  >= slice. len ( )  { 
681-             slice_end_index_len_fail ( * self . end ( ) ,  slice. len ( ) ) ; 
686+             slice_index_fail ( self . start ,   self . end ,  slice. len ( ) ) 
682687        } 
683688        self . into_slice_range ( ) . index ( slice) 
684689    } 
685690
686691    #[ inline]  
687692    fn  index_mut ( self ,  slice :  & mut  [ T ] )  -> & mut  [ T ]  { 
688693        if  * self . end ( )  >= slice. len ( )  { 
689-             slice_end_index_len_fail ( * self . end ( ) ,  slice. len ( ) ) ; 
694+             slice_index_fail ( self . start ,   self . end ,  slice. len ( ) ) 
690695        } 
691696        self . into_slice_range ( ) . index_mut ( slice) 
692697    } 
@@ -840,22 +845,22 @@ where
840845    let  len = bounds. end ; 
841846
842847    let  end = match  range. end_bound ( )  { 
843-         ops:: Bound :: Included ( & end)  if  end >= len => slice_end_index_len_fail ( end,  len) , 
848+         ops:: Bound :: Included ( & end)  if  end >= len => slice_index_fail ( 0 ,   end,  len) , 
844849        // Cannot overflow because `end < len` implies `end < usize::MAX`. 
845850        ops:: Bound :: Included ( & end)  => end + 1 , 
846851
847-         ops:: Bound :: Excluded ( & end)  if  end > len => slice_end_index_len_fail ( end,  len) , 
852+         ops:: Bound :: Excluded ( & end)  if  end > len => slice_index_fail ( 0 ,   end,  len) , 
848853        ops:: Bound :: Excluded ( & end)  => end, 
849854
850855        ops:: Bound :: Unbounded  => len, 
851856    } ; 
852857
853858    let  start = match  range. start_bound ( )  { 
854-         ops:: Bound :: Excluded ( & start)  if  start >= end => slice_index_order_fail ( start,  end) , 
859+         ops:: Bound :: Excluded ( & start)  if  start >= end => slice_index_fail ( start,  end,  len ) , 
855860        // Cannot overflow because `start < end` implies `start < usize::MAX`. 
856861        ops:: Bound :: Excluded ( & start)  => start + 1 , 
857862
858-         ops:: Bound :: Included ( & start)  if  start > end => slice_index_order_fail ( start,  end) , 
863+         ops:: Bound :: Included ( & start)  if  start > end => slice_index_fail ( start,  end,  len ) , 
859864        ops:: Bound :: Included ( & start)  => start, 
860865
861866        ops:: Bound :: Unbounded  => 0 , 
@@ -985,22 +990,22 @@ pub(crate) fn into_slice_range(
985990    ( start,  end) :  ( ops:: Bound < usize > ,  ops:: Bound < usize > ) , 
986991)  -> ops:: Range < usize >  { 
987992    let  end = match  end { 
988-         ops:: Bound :: Included ( end)  if  end >= len => slice_end_index_len_fail ( end,  len) , 
993+         ops:: Bound :: Included ( end)  if  end >= len => slice_index_fail ( 0 ,   end,  len) , 
989994        // Cannot overflow because `end < len` implies `end < usize::MAX`. 
990995        ops:: Bound :: Included ( end)  => end + 1 , 
991996
992-         ops:: Bound :: Excluded ( end)  if  end > len => slice_end_index_len_fail ( end,  len) , 
997+         ops:: Bound :: Excluded ( end)  if  end > len => slice_index_fail ( 0 ,   end,  len) , 
993998        ops:: Bound :: Excluded ( end)  => end, 
994999
9951000        ops:: Bound :: Unbounded  => len, 
9961001    } ; 
9971002
9981003    let  start = match  start { 
999-         ops:: Bound :: Excluded ( start)  if  start >= end => slice_index_order_fail ( start,  end) , 
1004+         ops:: Bound :: Excluded ( start)  if  start >= end => slice_index_fail ( start,  end,  len ) , 
10001005        // Cannot overflow because `start < end` implies `start < usize::MAX`. 
10011006        ops:: Bound :: Excluded ( start)  => start + 1 , 
10021007
1003-         ops:: Bound :: Included ( start)  if  start > end => slice_index_order_fail ( start,  end) , 
1008+         ops:: Bound :: Included ( start)  if  start > end => slice_index_fail ( start,  end,  len ) , 
10041009        ops:: Bound :: Included ( start)  => start, 
10051010
10061011        ops:: Bound :: Unbounded  => 0 , 
0 commit comments