diff --git a/compiler/rustc_middle/src/ty/list.rs b/compiler/rustc_middle/src/ty/list.rs index 44dfcbf1866a7..1dceda6c7aad0 100644 --- a/compiler/rustc_middle/src/ty/list.rs +++ b/compiler/rustc_middle/src/ty/list.rs @@ -63,17 +63,17 @@ impl List { let (layout, _offset) = Layout::new::().extend(Layout::for_value::<[T]>(slice)).unwrap(); - let mem = arena.dropless.alloc_raw(layout); + let mem = arena.dropless.alloc_raw(layout) as *mut List; unsafe { - let result = &mut *(mem as *mut List); // Write the length - result.len = slice.len(); + ptr::addr_of_mut!((*mem).len).write(slice.len()); // Write the elements - let arena_slice = slice::from_raw_parts_mut(result.data.as_mut_ptr(), result.len); - arena_slice.copy_from_slice(slice); + ptr::addr_of_mut!((*mem).data) + .cast::() + .copy_from_nonoverlapping(slice.as_ptr(), slice.len()); - result + &mut *mem } }