@@ -168,7 +168,9 @@ const fn in_place_collectible<DEST, SRC>(
168168    step_merge :  Option < NonZeroUsize > , 
169169    step_expand :  Option < NonZeroUsize > , 
170170)  -> bool  { 
171-     if  const  {  SRC :: IS_ZST  || DEST :: IS_ZST  || mem:: align_of :: < SRC > ( )  < mem:: align_of :: < DEST > ( )  }  { 
171+     // Require matching alignments because an alignment-changing realloc is inefficient on many 
172+     // system allocators and better implementations would require the unstable Allocator trait. 
173+     if  const  {  SRC :: IS_ZST  || DEST :: IS_ZST  || mem:: align_of :: < SRC > ( )  != mem:: align_of :: < DEST > ( )  }  { 
172174        return  false ; 
173175    } 
174176
@@ -188,7 +190,8 @@ const fn in_place_collectible<DEST, SRC>(
188190
189191const  fn  needs_realloc < SRC ,  DEST > ( src_cap :  usize ,  dst_cap :  usize )  -> bool  { 
190192    if  const  {  mem:: align_of :: < SRC > ( )  != mem:: align_of :: < DEST > ( )  }  { 
191-         return  src_cap > 0 ; 
193+         // FIXME: use unreachable! once that works in const 
194+         panic ! ( "in_place_collectible() prevents this" ) ; 
192195    } 
193196
194197    // If src type size is an integer multiple of the destination type size then 
@@ -276,8 +279,8 @@ where
276279        let  dst_guard = InPlaceDstBufDrop  {  ptr :  dst_buf,  len,  cap :  dst_cap } ; 
277280        src. forget_allocation_drop_remaining ( ) ; 
278281
279-         // Adjust the allocation if the alignment didn't match or the  source had a capacity in bytes 
280-         // that wasn't a multiple  of the destination type size. 
282+         // Adjust the allocation if the source had a capacity in bytes that wasn't a multiple  
283+         // of the destination type size. 
281284        // Since the discrepancy should generally be small this should only result in some 
282285        // bookkeeping updates and no memmove. 
283286        if  needs_realloc :: < I :: Src ,  T > ( src_cap,  dst_cap)  { 
@@ -290,7 +293,7 @@ where
290293                let  src_size = mem:: size_of :: < I :: Src > ( ) . unchecked_mul ( src_cap) ; 
291294                let  old_layout = Layout :: from_size_align_unchecked ( src_size,  src_align) ; 
292295
293-                 // The must be equal or smaller for in-place iteration to be possible 
296+                 // The allocation  must be equal or smaller for in-place iteration to be possible 
294297                // therefore the new layout must be ≤ the old one and therefore valid. 
295298                let  dst_align = mem:: align_of :: < T > ( ) ; 
296299                let  dst_size = mem:: size_of :: < T > ( ) . unchecked_mul ( dst_cap) ; 
0 commit comments