@@ -674,8 +674,9 @@ impl<T> [T] {
674
674
/// assert!(v == [3, 2, 1]);
675
675
/// ```
676
676
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
677
+ #[ rustc_const_unstable( feature = "const_reverse" , issue = "100784" ) ]
677
678
#[ inline]
678
- pub fn reverse ( & mut self ) {
679
+ pub const fn reverse ( & mut self ) {
679
680
let half_len = self . len ( ) / 2 ;
680
681
let Range { start, end } = self . as_mut_ptr_range ( ) ;
681
682
@@ -698,18 +699,20 @@ impl<T> [T] {
698
699
revswap ( front_half, back_half, half_len) ;
699
700
700
701
#[ inline]
701
- fn revswap < T > ( a : & mut [ T ] , b : & mut [ T ] , n : usize ) {
702
- debug_assert_eq ! ( a. len( ) , n) ;
703
- debug_assert_eq ! ( b. len( ) , n) ;
702
+ const fn revswap < T > ( a : & mut [ T ] , b : & mut [ T ] , n : usize ) {
703
+ debug_assert ! ( a. len( ) == n) ;
704
+ debug_assert ! ( b. len( ) == n) ;
704
705
705
706
// Because this function is first compiled in isolation,
706
707
// this check tells LLVM that the indexing below is
707
708
// in-bounds. Then after inlining -- once the actual
708
709
// lengths of the slices are known -- it's removed.
709
710
let ( a, b) = ( & mut a[ ..n] , & mut b[ ..n] ) ;
710
711
711
- for i in 0 ..n {
712
+ let mut i = 0 ;
713
+ while i < n {
712
714
mem:: swap ( & mut a[ i] , & mut b[ n - 1 - i] ) ;
715
+ i += 1 ;
713
716
}
714
717
}
715
718
}
0 commit comments