Skip to content

Commit

Permalink
add tests for panicky drop in thread_local destructor
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Jun 16, 2023
1 parent c853744 commit e2d2266
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/tools/miri/tests/fail/panic/thread_local_const_drop_panic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//@error-in-other-file: aborted execution

pub struct NoisyDrop {}

impl Drop for NoisyDrop {
fn drop(&mut self) {
panic!("ow");
}
}

thread_local! {
pub static NOISY: NoisyDrop = const { NoisyDrop {} };
}

fn main() {
NOISY.with(|_| ());
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
thread '<unnamed>' panicked at 'ow', $DIR/thread_local_const_drop_panic.rs:LL:CC
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fatal runtime error: thread local panicked on drop
error: abnormal termination: the program aborted execution
--> RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
LL | unsafe { libc::abort() }
| ^^^^^^^^^^^^^ the program aborted execution
|
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
= note: inside `<std::thread::local_impl::abort_on_dtor_unwind::DtorUnwindGuard as std::ops::Drop>::drop` at RUSTLIB/std/src/rt.rs:LL:CC
= note: inside `std::ptr::drop_in_place::<std::thread::local_impl::abort_on_dtor_unwind::DtorUnwindGuard> - shim(Some(std::thread::local_impl::abort_on_dtor_unwind::DtorUnwindGuard))` at RUSTLIB/core/src/ptr/mod.rs:LL:CC
= note: inside `RUSTLIB/std/src/sys/PLATFORM/thread_local/fast_local.rs:LL:CC]>` at RUSTLIB/std/src/sys/PLATFORM/thread_local/mod.rs:LL:CC
note: inside `NOISY::__getit::destroy`
--> $DIR/thread_local_const_drop_panic.rs:LL:CC
|
LL | / thread_local! {
LL | | pub static NOISY: NoisyDrop = const { NoisyDrop {} };
LL | | }
| |_^
= note: this error originates in the macro `$crate::thread::local_impl::thread_local_inner` which comes from the expansion of the macro `thread_local` (in Nightly builds, run with -Z macro-backtrace for more info)

note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace

error: aborting due to previous error

17 changes: 17 additions & 0 deletions src/tools/miri/tests/fail/panic/thread_local_drop_panic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//@error-in-other-file: aborted execution

pub struct NoisyDrop {}

impl Drop for NoisyDrop {
fn drop(&mut self) {
panic!("ow");
}
}

thread_local! {
pub static NOISY: NoisyDrop = NoisyDrop {};
}

fn main() {
NOISY.with(|_| ());
}
15 changes: 15 additions & 0 deletions src/tools/miri/tests/fail/panic/thread_local_drop_panic.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
thread '<unnamed>' panicked at 'ow', $DIR/thread_local_drop_panic.rs:LL:CC
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fatal runtime error: thread local panicked on drop
error: abnormal termination: the program aborted execution
--> RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
LL | unsafe { libc::abort() }
| ^^^^^^^^^^^^^ the program aborted execution
|
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
= note: inside `std::sys::PLATFORM::thread_local::fast_local::destroy_value::<NoisyDrop>` at RUSTLIB/std/src/rt.rs:LL:CC
= note: inside `std::sys_common::thread_local_dtor::register_dtor_fallback::run_dtors` at RUSTLIB/std/src/sys_common/thread_local_dtor.rs:LL:CC

error: aborting due to previous error

0 comments on commit e2d2266

Please sign in to comment.