@@ -7,6 +7,7 @@ use std::hash;
7
7
use std:: iter;
8
8
use std:: ops:: { Deref , Range } ;
9
9
use std:: ptr;
10
+ use std:: mem:: MaybeUninit ;
10
11
11
12
use rustc_ast:: Mutability ;
12
13
use rustc_data_structures:: intern:: Interned ;
@@ -211,14 +212,15 @@ impl<Prov> Allocation<Prov> {
211
212
let size = Size :: from_bytes ( slice. len ( ) ) ;
212
213
let align_usize: usize = align. bytes ( ) . try_into ( ) . unwrap ( ) ;
213
214
let layout = std:: alloc:: Layout :: from_size_align ( slice. len ( ) , align_usize) . unwrap ( ) ;
214
- let vec_align = unsafe {
215
+ let bytes = unsafe {
215
216
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 ( )
217
221
} ;
218
222
219
- let mut bytes = vec_align. into_boxed_slice ( ) ;
220
223
assert ! ( bytes. as_ptr( ) as u64 % align. bytes( ) == 0 ) ;
221
- bytes. copy_from_slice ( & slice) ;
222
224
223
225
Self {
224
226
bytes,
@@ -286,14 +288,15 @@ impl Allocation {
286
288
// Realign the pointer
287
289
let align_usize: usize = self . align . bytes ( ) . try_into ( ) . unwrap ( ) ;
288
290
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 {
290
292
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 ( )
292
297
} ;
293
- assert ! ( vec_align . as_ptr( ) as usize % align_usize == 0 ) ;
298
+ assert ! ( bytes . as_ptr( ) as usize % align_usize == 0 ) ;
294
299
295
- vec_align[ ..self . bytes . len ( ) ] . copy_from_slice ( & self . bytes ) ;
296
- let mut bytes = vec_align. into_boxed_slice ( ) ;
297
300
let mut new_relocations = Vec :: with_capacity ( self . relocations . 0 . len ( ) ) ;
298
301
let ptr_size = cx. data_layout ( ) . pointer_size . bytes_usize ( ) ;
299
302
let endian = cx. data_layout ( ) . endian ;
0 commit comments