|  | // skip-filecheck | 
|  | //@ test-mir-pass: ElaborateDrops | 
|  | //@ needs-unwind | 
|  | #![feature(allocator_api)] | 
|  |  | 
|  | // Regression test for #131082. | 
|  | // Testing that the allocator of a Box is dropped in conditional drops | 
|  |  | 
|  | use std::alloc::{AllocError, Allocator, Global, Layout}; | 
|  | use std::ptr::NonNull; | 
|  |  | 
|  | struct DropAllocator; | 
|  |  | 
|  | unsafe impl Allocator for DropAllocator { | 
|  | fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> { | 
|  | Global.allocate(layout) | 
|  | } | 
|  | unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) { | 
|  | Global.deallocate(ptr, layout); | 
|  | } | 
|  | } | 
|  | impl Drop for DropAllocator { | 
|  | fn drop(&mut self) {} | 
|  | } | 
|  |  | 
|  | struct HasDrop; | 
|  | impl Drop for HasDrop { | 
|  | fn drop(&mut self) {} | 
|  | } | 
|  |  | 
|  | // EMIT_MIR box_conditional_drop_allocator.main.ElaborateDrops.diff | 
|  | fn main() { | 
|  | let b = Box::new_in(HasDrop, DropAllocator); | 
|  | if true { | 
|  | drop(*b); | 
|  | } else { | 
|  | drop(b); | 
|  | } | 
|  | } |