| // 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); |
| } |
| } |