75
75
}
76
76
}
77
77
78
- #[ inline( never) ]
79
- #[ cold]
80
- #[ track_caller]
81
- const fn str_index_overflow_fail ( ) -> ! {
82
- panic ! ( "attempted to index str up to maximum usize" ) ;
83
- }
84
-
85
78
/// Implements substring slicing with syntax `&self[..]` or `&mut self[..]`.
86
79
///
87
80
/// Returns a slice of the whole string, i.e., returns `&self` or `&mut
@@ -639,11 +632,11 @@ unsafe impl const SliceIndex<str> for ops::RangeInclusive<usize> {
639
632
type Output = str ;
640
633
#[ inline]
641
634
fn get ( self , slice : & str ) -> Option < & Self :: Output > {
642
- if * self . end ( ) == usize :: MAX { None } else { self . into_slice_range ( ) . get ( slice) }
635
+ if * self . end ( ) >= slice . len ( ) { None } else { self . into_slice_range ( ) . get ( slice) }
643
636
}
644
637
#[ inline]
645
638
fn get_mut ( self , slice : & mut str ) -> Option < & mut Self :: Output > {
646
- if * self . end ( ) == usize :: MAX { None } else { self . into_slice_range ( ) . get_mut ( slice) }
639
+ if * self . end ( ) >= slice . len ( ) { None } else { self . into_slice_range ( ) . get_mut ( slice) }
647
640
}
648
641
#[ inline]
649
642
unsafe fn get_unchecked ( self , slice : * const str ) -> * const Self :: Output {
@@ -657,15 +650,15 @@ unsafe impl const SliceIndex<str> for ops::RangeInclusive<usize> {
657
650
}
658
651
#[ inline]
659
652
fn index ( self , slice : & str ) -> & Self :: Output {
660
- if * self . end ( ) == usize :: MAX {
661
- str_index_overflow_fail ( ) ;
653
+ if * self . end ( ) >= slice . len ( ) {
654
+ super :: slice_error_fail ( slice , * self . start ( ) , * self . end ( ) ) ;
662
655
}
663
656
self . into_slice_range ( ) . index ( slice)
664
657
}
665
658
#[ inline]
666
659
fn index_mut ( self , slice : & mut str ) -> & mut Self :: Output {
667
- if * self . end ( ) == usize :: MAX {
668
- str_index_overflow_fail ( ) ;
660
+ if * self . end ( ) >= slice . len ( ) {
661
+ super :: slice_error_fail ( slice , * self . start ( ) , * self . end ( ) ) ;
669
662
}
670
663
self . into_slice_range ( ) . index_mut ( slice)
671
664
}
@@ -677,35 +670,29 @@ unsafe impl const SliceIndex<str> for range::RangeInclusive<usize> {
677
670
type Output = str ;
678
671
#[ inline]
679
672
fn get ( self , slice : & str ) -> Option < & Self :: Output > {
680
- if self . end == usize :: MAX { None } else { self . into_slice_range ( ) . get ( slice) }
673
+ ops :: RangeInclusive :: from ( self ) . get ( slice)
681
674
}
682
675
#[ inline]
683
676
fn get_mut ( self , slice : & mut str ) -> Option < & mut Self :: Output > {
684
- if self . end == usize :: MAX { None } else { self . into_slice_range ( ) . get_mut ( slice) }
677
+ ops :: RangeInclusive :: from ( self ) . get_mut ( slice)
685
678
}
686
679
#[ inline]
687
680
unsafe fn get_unchecked ( self , slice : * const str ) -> * const Self :: Output {
688
681
// SAFETY: the caller must uphold the safety contract for `get_unchecked`.
689
- unsafe { self . into_slice_range ( ) . get_unchecked ( slice) }
682
+ unsafe { ops :: RangeInclusive :: from ( self ) . get_unchecked ( slice) }
690
683
}
691
684
#[ inline]
692
685
unsafe fn get_unchecked_mut ( self , slice : * mut str ) -> * mut Self :: Output {
693
686
// SAFETY: the caller must uphold the safety contract for `get_unchecked_mut`.
694
- unsafe { self . into_slice_range ( ) . get_unchecked_mut ( slice) }
687
+ unsafe { ops :: RangeInclusive :: from ( self ) . get_unchecked_mut ( slice) }
695
688
}
696
689
#[ inline]
697
690
fn index ( self , slice : & str ) -> & Self :: Output {
698
- if self . end == usize:: MAX {
699
- str_index_overflow_fail ( ) ;
700
- }
701
- self . into_slice_range ( ) . index ( slice)
691
+ ops:: RangeInclusive :: from ( self ) . index ( slice)
702
692
}
703
693
#[ inline]
704
694
fn index_mut ( self , slice : & mut str ) -> & mut Self :: Output {
705
- if self . end == usize:: MAX {
706
- str_index_overflow_fail ( ) ;
707
- }
708
- self . into_slice_range ( ) . index_mut ( slice)
695
+ ops:: RangeInclusive :: from ( self ) . index_mut ( slice)
709
696
}
710
697
}
711
698
0 commit comments