@@ -571,11 +571,12 @@ impl<K, V, A: Allocator> BTreeMap<K, V, A> {
571571/// ``` 
572572#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
573573 pub  fn  clear ( & mut  self )  { 
574-  let  alloc = unsafe  { 
575-  // drop all elements and retrieve allocator 
576-  ptr:: read ( self ) . into_iter ( ) . into_alloc ( ) 
577-  } ; 
578-  * self  = BTreeMap :: new_in ( alloc) ; 
574+  // avoid moving the allocator 
575+  mem:: drop ( BTreeMap  { 
576+  root :  mem:: replace ( & mut  self . root ,  None ) , 
577+  length :  mem:: replace ( & mut  self . length ,  0 ) , 
578+  alloc :  ManuallyDrop :: new ( & * self . alloc ) , 
579+  } ) ; 
579580 } 
580581
581582 /// Makes a new empty BTreeMap with a reasonable choice for B. 
@@ -1594,11 +1595,6 @@ impl<K, V, A: Allocator> IntoIterator for BTreeMap<K, V, A> {
15941595#[ stable( feature = "btree_drop" ,  since = "1.7.0" ) ]  
15951596impl < K ,  V ,  A :  Allocator >  Drop  for  IntoIter < K ,  V ,  A >  { 
15961597 fn  drop ( & mut  self )  { 
1597-  self . dealloc ( ) 
1598-  } 
1599- } 
1600- impl < K ,  V ,  A :  Allocator >  IntoIter < K ,  V ,  A >  { 
1601-  fn  dealloc ( & mut  self )  { 
16021598 struct  DropGuard < ' a ,  K ,  V ,  A :  Allocator > ( & ' a  mut  IntoIter < K ,  V ,  A > ) ; 
16031599
16041600 impl < ' a ,  K ,  V ,  A :  Allocator >  Drop  for  DropGuard < ' a ,  K ,  V ,  A >  { 
@@ -1649,11 +1645,6 @@ impl<K, V, A: Allocator> IntoIter<K, V, A> {
16491645 Some ( unsafe  {  self . range . deallocating_next_back_unchecked ( & self . alloc )  } ) 
16501646 } 
16511647 } 
1652-  fn  into_alloc ( mut  self )  -> A  { 
1653-  self . dealloc ( ) ;  // Deallocate, then don't drop as drop will also call dealloc 
1654-  let  iter = ManuallyDrop :: new ( self ) ; 
1655-  unsafe  {  ptr:: read ( & iter. alloc )  } 
1656-  } 
16571648} 
16581649
16591650#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
0 commit comments