@@ -157,12 +157,12 @@ use core::hash::{Hash, Hasher};
157157use core:: iter:: FusedIterator ;
158158use core:: marker:: Tuple ;
159159use core:: marker:: Unsize ;
160- use core:: mem;
160+ use core:: mem:: { self , SizedTypeProperties } ;
161161use core:: ops:: {
162162 CoerceUnsized , Deref , DerefMut , DispatchFromDyn , Generator , GeneratorState , Receiver ,
163163} ;
164164use core:: pin:: Pin ;
165- use core:: ptr:: { self , Unique } ;
165+ use core:: ptr:: { self , NonNull , Unique } ;
166166use core:: task:: { Context , Poll } ;
167167
168168#[ cfg( not( no_global_oom_handling) ) ]
@@ -479,8 +479,12 @@ impl<T, A: Allocator> Box<T, A> {
479479 where
480480 A : Allocator ,
481481 {
482- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
483- let ptr = alloc. allocate ( layout) ?. cast ( ) ;
482+ let ptr = if T :: IS_ZST {
483+ NonNull :: dangling ( )
484+ } else {
485+ let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
486+ alloc. allocate ( layout) ?. cast ( )
487+ } ;
484488 unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
485489 }
486490
@@ -549,8 +553,12 @@ impl<T, A: Allocator> Box<T, A> {
549553 where
550554 A : Allocator ,
551555 {
552- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
553- let ptr = alloc. allocate_zeroed ( layout) ?. cast ( ) ;
556+ let ptr = if T :: IS_ZST {
557+ NonNull :: dangling ( )
558+ } else {
559+ let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
560+ alloc. allocate_zeroed ( layout) ?. cast ( )
561+ } ;
554562 unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
555563 }
556564
@@ -675,14 +683,16 @@ impl<T> Box<[T]> {
675683 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
676684 #[ inline]
677685 pub fn try_new_uninit_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
678- unsafe {
686+ let ptr = if T :: IS_ZST || len == 0 {
687+ NonNull :: dangling ( )
688+ } else {
679689 let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
680690 Ok ( l) => l,
681691 Err ( _) => return Err ( AllocError ) ,
682692 } ;
683- let ptr = Global . allocate ( layout) ?;
684- Ok ( RawVec :: from_raw_parts_in ( ptr . as_mut_ptr ( ) as * mut _ , len , Global ) . into_box ( len ) )
685- }
693+ Global . allocate ( layout) ?. cast ( )
694+ } ;
695+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
686696 }
687697
688698 /// Constructs a new boxed slice with uninitialized contents, with the memory
@@ -707,14 +717,16 @@ impl<T> Box<[T]> {
707717 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
708718 #[ inline]
709719 pub fn try_new_zeroed_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
710- unsafe {
720+ let ptr = if T :: IS_ZST || len == 0 {
721+ NonNull :: dangling ( )
722+ } else {
711723 let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
712724 Ok ( l) => l,
713725 Err ( _) => return Err ( AllocError ) ,
714726 } ;
715- let ptr = Global . allocate_zeroed ( layout) ?;
716- Ok ( RawVec :: from_raw_parts_in ( ptr . as_mut_ptr ( ) as * mut _ , len , Global ) . into_box ( len ) )
717- }
727+ Global . allocate_zeroed ( layout) ?. cast ( )
728+ } ;
729+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
718730 }
719731}
720732
@@ -1219,7 +1231,9 @@ unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for Box<T, A> {
12191231
12201232 unsafe {
12211233 let layout = Layout :: for_value_raw ( ptr. as_ptr ( ) ) ;
1222- self . 1 . deallocate ( From :: from ( ptr. cast ( ) ) , layout)
1234+ if layout. size ( ) != 0 {
1235+ self . 1 . deallocate ( From :: from ( ptr. cast ( ) ) , layout) ;
1236+ }
12231237 }
12241238 }
12251239}
0 commit comments