@@ -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;
162+ use core:: mem:: { self , SizedTypeProperties } ;
163163use core:: ops:: {
164164 CoerceUnsized , Deref , DerefMut , DispatchFromDyn , Generator , GeneratorState , Receiver ,
165165} ;
166166use core:: pin:: Pin ;
167- use core:: ptr:: { self , Unique } ;
167+ use core:: ptr:: { self , NonNull , Unique } ;
168168use core:: task:: { Context , Poll } ;
169169
170170#[ cfg( not( no_global_oom_handling) ) ]
@@ -483,8 +483,12 @@ impl<T, A: Allocator> Box<T, A> {
483483 where
484484 A : Allocator ,
485485 {
486- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
487- let ptr = alloc. allocate ( layout) ?. cast ( ) ;
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+ } ;
488492 unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
489493 }
490494
@@ -553,8 +557,12 @@ impl<T, A: Allocator> Box<T, A> {
553557 where
554558 A : Allocator ,
555559 {
556- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
557- let ptr = alloc. allocate_zeroed ( layout) ?. cast ( ) ;
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+ } ;
558566 unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
559567 }
560568
@@ -679,14 +687,16 @@ impl<T> Box<[T]> {
679687 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
680688 #[ inline]
681689 pub fn try_new_uninit_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
682- unsafe {
690+ let ptr = if T :: IS_ZST || len == 0 {
691+ NonNull :: dangling ( )
692+ } else {
683693 let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
684694 Ok ( l) => l,
685695 Err ( _) => return Err ( AllocError ) ,
686696 } ;
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- }
697+ Global . allocate ( layout) ?. cast ( )
698+ } ;
699+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
690700 }
691701
692702 /// Constructs a new boxed slice with uninitialized contents, with the memory
@@ -711,14 +721,16 @@ impl<T> Box<[T]> {
711721 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
712722 #[ inline]
713723 pub fn try_new_zeroed_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
714- unsafe {
724+ let ptr = if T :: IS_ZST || len == 0 {
725+ NonNull :: dangling ( )
726+ } else {
715727 let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
716728 Ok ( l) => l,
717729 Err ( _) => return Err ( AllocError ) ,
718730 } ;
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- }
731+ Global . allocate_zeroed ( layout) ?. cast ( )
732+ } ;
733+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
722734 }
723735}
724736
@@ -1215,8 +1227,18 @@ impl<T: ?Sized, A: Allocator> Box<T, A> {
12151227
12161228#[ stable( feature = "rust1" , since = "1.0.0" ) ]
12171229unsafe impl < #[ may_dangle] T : ?Sized , A : Allocator > Drop for Box < T , A > {
1230+ #[ inline]
12181231 fn drop ( & mut self ) {
1219- // FIXME: Do nothing, drop is currently performed by compiler.
1232+ // the T in the Box is dropped by the compiler before the destructor is run
1233+
1234+ let ptr = self . 0 ;
1235+
1236+ unsafe {
1237+ let layout = Layout :: for_value_raw ( ptr. as_ptr ( ) ) ;
1238+ if layout. size ( ) != 0 {
1239+ self . 1 . deallocate ( From :: from ( ptr. cast ( ) ) , layout) ;
1240+ }
1241+ }
12201242 }
12211243}
12221244
@@ -2165,7 +2187,7 @@ impl dyn Error + Send {
21652187 let err: Box < dyn Error > = self ;
21662188 <dyn Error >:: downcast ( err) . map_err ( |s| unsafe {
21672189 // Reapply the `Send` marker.
2168- mem :: transmute :: < Box < dyn Error > , Box < dyn Error + Send > > ( s )
2190+ Box :: from_raw ( Box :: into_raw ( s ) as * mut ( dyn Error + Send ) )
21692191 } )
21702192 }
21712193}
@@ -2179,7 +2201,7 @@ impl dyn Error + Send + Sync {
21792201 let err: Box < dyn Error > = self ;
21802202 <dyn Error >:: downcast ( err) . map_err ( |s| unsafe {
21812203 // Reapply the `Send + Sync` marker.
2182- mem :: transmute :: < Box < dyn Error > , Box < dyn Error + Send + Sync > > ( s )
2204+ Box :: from_raw ( Box :: into_raw ( s ) as * mut ( dyn Error + Send + Sync ) )
21832205 } )
21842206 }
21852207}
0 commit comments