Add test for -Z panic-in-drop=abort
This commit is contained in:
parent
a149bed3bd
commit
5862a0004a
54
src/test/codegen/panic-in-drop-abort.rs
Normal file
54
src/test/codegen/panic-in-drop-abort.rs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// compile-flags: -Z panic-in-drop=abort -O
|
||||||
|
|
||||||
|
// Ensure that unwinding code paths are eliminated from the output after
|
||||||
|
// optimization.
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
use std::any::Any;
|
||||||
|
use std::mem::forget;
|
||||||
|
|
||||||
|
pub struct ExternDrop;
|
||||||
|
impl Drop for ExternDrop {
|
||||||
|
#[inline(always)]
|
||||||
|
fn drop(&mut self) {
|
||||||
|
// This call may potentially unwind.
|
||||||
|
extern "Rust" {
|
||||||
|
fn extern_drop();
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
extern_drop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct AssertNeverDrop;
|
||||||
|
impl Drop for AssertNeverDrop {
|
||||||
|
#[inline(always)]
|
||||||
|
fn drop(&mut self) {
|
||||||
|
// This call should be optimized away as unreachable.
|
||||||
|
extern "C" {
|
||||||
|
fn should_not_appear_in_output();
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
should_not_appear_in_output();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: normal_drop
|
||||||
|
// CHECK-NOT: should_not_appear_in_output
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn normal_drop(x: ExternDrop) {
|
||||||
|
let guard = AssertNeverDrop;
|
||||||
|
drop(x);
|
||||||
|
forget(guard);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: indirect_drop
|
||||||
|
// CHECK-NOT: should_not_appear_in_output
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn indirect_drop(x: Box<dyn Any>) {
|
||||||
|
let guard = AssertNeverDrop;
|
||||||
|
drop(x);
|
||||||
|
forget(guard);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user