@@ -7,6 +7,7 @@ use std::hash;
77use std:: iter;
88use std:: ops:: { Deref , Range } ;
99use std:: ptr;
10+ use std:: mem:: MaybeUninit ;
1011
1112use rustc_ast:: Mutability ;
1213use rustc_data_structures:: intern:: Interned ;
@@ -211,14 +212,15 @@ impl<Prov> Allocation<Prov> {
211212 let size = Size :: from_bytes ( slice. len ( ) ) ;
212213 let align_usize: usize = align. bytes ( ) . try_into ( ) . unwrap ( ) ;
213214 let layout = std:: alloc:: Layout :: from_size_align ( slice. len ( ) , align_usize) . unwrap ( ) ;
214- let vec_align = unsafe {
215+ let bytes = unsafe {
215216 let buf = std:: alloc:: alloc ( layout) ;
216- Vec :: from_raw_parts ( buf as * mut u8 , size. bytes_usize ( ) , size. bytes_usize ( ) )
217+ let mut uninit_bytes = Vec :: from_raw_parts ( buf as * mut MaybeUninit < u8 > , slice. len ( ) , slice. len ( ) ) ;
218+ let mut boxed = Box :: < [ MaybeUninit < u8 > ] > :: from_raw ( & mut * uninit_bytes) ;
219+ MaybeUninit :: write_slice ( & mut boxed, & slice) ;
220+ boxed. assume_init ( )
217221 } ;
218222
219- let mut bytes = vec_align. into_boxed_slice ( ) ;
220223 assert ! ( bytes. as_ptr( ) as u64 % align. bytes( ) == 0 ) ;
221- bytes. copy_from_slice ( & slice) ;
222224
223225 Self {
224226 bytes,
@@ -286,14 +288,15 @@ impl Allocation {
286288 // Realign the pointer
287289 let align_usize: usize = self . align . bytes ( ) . try_into ( ) . unwrap ( ) ;
288290 let layout = std:: alloc:: Layout :: from_size_align ( self . bytes . len ( ) , align_usize) . unwrap ( ) ;
289- let mut vec_align = unsafe {
291+ let mut bytes = unsafe {
290292 let buf = std:: alloc:: alloc ( layout) ;
291- Vec :: from_raw_parts ( buf as * mut u8 , self . bytes . len ( ) , self . bytes . len ( ) )
293+ let mut uninit_bytes = Vec :: from_raw_parts ( buf as * mut MaybeUninit < u8 > , self . bytes . len ( ) , self . bytes . len ( ) ) ;
294+ let mut boxed = Box :: < [ MaybeUninit < u8 > ] > :: from_raw ( & mut * uninit_bytes) ;
295+ MaybeUninit :: write_slice ( & mut boxed, & self . bytes ) ;
296+ boxed. assume_init ( )
292297 } ;
293- assert ! ( vec_align . as_ptr( ) as usize % align_usize == 0 ) ;
298+ assert ! ( bytes . as_ptr( ) as usize % align_usize == 0 ) ;
294299
295- vec_align[ ..self . bytes . len ( ) ] . copy_from_slice ( & self . bytes ) ;
296- let mut bytes = vec_align. into_boxed_slice ( ) ;
297300 let mut new_relocations = Vec :: with_capacity ( self . relocations . 0 . len ( ) ) ;
298301 let ptr_size = cx. data_layout ( ) . pointer_size . bytes_usize ( ) ;
299302 let endian = cx. data_layout ( ) . endian ;
0 commit comments