mirror of
https://github.com/rust-lang/rust.git
synced 2025-09-28 13:46:03 +00:00
40 lines
906 B
Rust
40 lines
906 B
Rust
// 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);
|
|
}
|
|
}
|