@@ -159,12 +159,12 @@ use core::hash::{Hash, Hasher};
159159use core:: iter:: FusedIterator ;
160160use core:: marker:: Tuple ;
161161use core:: marker:: Unsize ;
162- use core:: mem:: { self , SizedTypeProperties } ;
162+ use core:: mem;
163163use core:: ops:: {
164164 CoerceUnsized , Deref , DerefMut , DispatchFromDyn , Generator , GeneratorState , Receiver ,
165165} ;
166166use core:: pin:: Pin ;
167- use core:: ptr:: { self , NonNull , Unique } ;
167+ use core:: ptr:: { self , Unique } ;
168168use core:: task:: { Context , Poll } ;
169169
170170#[ cfg( not( no_global_oom_handling) ) ]
@@ -483,12 +483,8 @@ impl<T, A: Allocator> Box<T, A> {
483483 where
484484 A : Allocator ,
485485 {
486- let ptr = if T :: IS_ZST {
487- NonNull :: dangling ( )
488- } else {
489- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
490- alloc. allocate ( layout) ?. cast ( )
491- } ;
486+ let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
487+ let ptr = alloc. allocate ( layout) ?. cast ( ) ;
492488 unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
493489 }
494490
@@ -557,12 +553,8 @@ impl<T, A: Allocator> Box<T, A> {
557553 where
558554 A : Allocator ,
559555 {
560- let ptr = if T :: IS_ZST {
561- NonNull :: dangling ( )
562- } else {
563- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
564- alloc. allocate_zeroed ( layout) ?. cast ( )
565- } ;
556+ let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
557+ let ptr = alloc. allocate_zeroed ( layout) ?. cast ( ) ;
566558 unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
567559 }
568560
@@ -687,16 +679,14 @@ impl<T> Box<[T]> {
687679 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
688680 #[ inline]
689681 pub fn try_new_uninit_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
690- let ptr = if T :: IS_ZST || len == 0 {
691- NonNull :: dangling ( )
692- } else {
682+ unsafe {
693683 let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
694684 Ok ( l) => l,
695685 Err ( _) => return Err ( AllocError ) ,
696686 } ;
697- Global . allocate ( layout) ?. cast ( )
698- } ;
699- unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
687+ let ptr = Global . allocate ( layout) ?;
688+ Ok ( RawVec :: from_raw_parts_in ( ptr . as_mut_ptr ( ) as * mut _ , len , Global ) . into_box ( len ) )
689+ }
700690 }
701691
702692 /// Constructs a new boxed slice with uninitialized contents, with the memory
@@ -721,16 +711,14 @@ impl<T> Box<[T]> {
721711 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
722712 #[ inline]
723713 pub fn try_new_zeroed_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
724- let ptr = if T :: IS_ZST || len == 0 {
725- NonNull :: dangling ( )
726- } else {
714+ unsafe {
727715 let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
728716 Ok ( l) => l,
729717 Err ( _) => return Err ( AllocError ) ,
730718 } ;
731- Global . allocate_zeroed ( layout) ?. cast ( )
732- } ;
733- unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
719+ let ptr = Global . allocate_zeroed ( layout) ?;
720+ Ok ( RawVec :: from_raw_parts_in ( ptr . as_mut_ptr ( ) as * mut _ , len , Global ) . into_box ( len ) )
721+ }
734722 }
735723}
736724
@@ -1235,9 +1223,7 @@ unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for Box<T, A> {
12351223
12361224 unsafe {
12371225 let layout = Layout :: for_value_raw ( ptr. as_ptr ( ) ) ;
1238- if layout. size ( ) != 0 {
1239- self . 1 . deallocate ( From :: from ( ptr. cast ( ) ) , layout) ;
1240- }
1226+ self . 1 . deallocate ( From :: from ( ptr. cast ( ) ) , layout)
12411227 }
12421228 }
12431229}
@@ -2187,7 +2173,7 @@ impl dyn Error + Send {
21872173 let err: Box < dyn Error > = self ;
21882174 <dyn Error >:: downcast ( err) . map_err ( |s| unsafe {
21892175 // Reapply the `Send` marker.
2190- Box :: from_raw ( Box :: into_raw ( s ) as * mut ( dyn Error + Send ) )
2176+ mem :: transmute :: < Box < dyn Error > , Box < dyn Error + Send > > ( s )
21912177 } )
21922178 }
21932179}
@@ -2201,7 +2187,7 @@ impl dyn Error + Send + Sync {
22012187 let err: Box < dyn Error > = self ;
22022188 <dyn Error >:: downcast ( err) . map_err ( |s| unsafe {
22032189 // Reapply the `Send + Sync` marker.
2204- Box :: from_raw ( Box :: into_raw ( s ) as * mut ( dyn Error + Send + Sync ) )
2190+ mem :: transmute :: < Box < dyn Error > , Box < dyn Error + Send + Sync > > ( s )
22052191 } )
22062192 }
22072193}
0 commit comments