@@ -595,7 +595,6 @@ fn fmt_u128(n: u128, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::R
595595 // 2^128 is about 3*10^38, so 39 gives an extra byte of space
596596 let mut buf = [ MaybeUninit :: < u8 > :: uninit ( ) ; 39 ] ;
597597 let mut curr = buf. len ( ) as isize ;
598- let buf_ptr = MaybeUninit :: slice_as_mut_ptr ( & mut buf) ;
599598
600599 let ( n, rem) = udiv_1e19 ( n) ;
601600 parse_u64_into ( rem, & mut buf, & mut curr) ;
@@ -606,7 +605,11 @@ fn fmt_u128(n: u128, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::R
606605 // SAFETY: Guaranteed that we wrote at most 19 bytes, and there must be space
607606 // remaining since it has length 39
608607 unsafe {
609- ptr:: write_bytes ( buf_ptr. offset ( target) , b'0' , ( curr - target) as usize ) ;
608+ ptr:: write_bytes (
609+ MaybeUninit :: slice_as_mut_ptr ( & mut buf) . offset ( target) ,
610+ b'0' ,
611+ ( curr - target) as usize ,
612+ ) ;
610613 }
611614 curr = target;
612615
@@ -615,6 +618,9 @@ fn fmt_u128(n: u128, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::R
615618 // Should this following branch be annotated with unlikely?
616619 if n != 0 {
617620 let target = ( buf. len ( ) - 38 ) as isize ;
621+ // The raw `buf_ptr` pointer is only valid until `buf` is used the next time,
622+ // buf `buf` is not used in this scope so we are good.
623+ let buf_ptr = MaybeUninit :: slice_as_mut_ptr ( & mut buf) ;
618624 // SAFETY: At this point we wrote at most 38 bytes, pad up to that point,
619625 // There can only be at most 1 digit remaining.
620626 unsafe {
@@ -629,7 +635,7 @@ fn fmt_u128(n: u128, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::R
629635 // UTF-8 since `DEC_DIGITS_LUT` is
630636 let buf_slice = unsafe {
631637 str:: from_utf8_unchecked ( slice:: from_raw_parts (
632- buf_ptr . offset ( curr) ,
638+ MaybeUninit :: slice_as_mut_ptr ( & mut buf ) . offset ( curr) ,
633639 buf. len ( ) - curr as usize ,
634640 ) )
635641 } ;
0 commit comments