about summary refs log tree commit diff
diff options
context:
space:
mode:
authorreez12g <reez12g@gmail.com>2022-02-22 08:37:52 +0900
committerMark Rousskov <mark.simulacrum@gmail.com>2022-03-03 22:41:27 -0500
commitbca67fe02f010754b5522c2c6234375cffa66b81 (patch)
treebd94d4205ae556425b5d4f2cc7a9d0e122dcb94c
parent6d7684101a51f1c375ec84aef5d2fbdeb214bbc2 (diff)
downloadrust-bca67fe02f010754b5522c2c6234375cffa66b81.tar.gz
rust-bca67fe02f010754b5522c2c6234375cffa66b81.zip
Add #[track_caller] to track callers when initializing poisoned Once
-rw-r--r--library/std/src/sync/once.rs2
-rw-r--r--src/test/ui/issues/issue-87707.rs15
-rw-r--r--src/test/ui/issues/issue-87707.run.stderr3
3 files changed, 20 insertions, 0 deletions
diff --git a/library/std/src/sync/once.rs b/library/std/src/sync/once.rs
index f76d0759561..511de863dc5 100644
--- a/library/std/src/sync/once.rs
+++ b/library/std/src/sync/once.rs
@@ -256,6 +256,7 @@ impl Once {
     ///
     /// [poison]: struct.Mutex.html#poisoning
     #[stable(feature = "rust1", since = "1.0.0")]
+    #[track_caller]
     pub fn call_once<F>(&self, f: F)
     where
         F: FnOnce(),
@@ -390,6 +391,7 @@ impl Once {
     // currently no way to take an `FnOnce` and call it via virtual dispatch
     // without some allocation overhead.
     #[cold]
+    #[track_caller]
     fn call_inner(&self, ignore_poisoning: bool, init: &mut dyn FnMut(&OnceState)) {
         let mut state_and_queue = self.state_and_queue.load(Ordering::Acquire);
         loop {
diff --git a/src/test/ui/issues/issue-87707.rs b/src/test/ui/issues/issue-87707.rs
new file mode 100644
index 00000000000..d2e9343f86c
--- /dev/null
+++ b/src/test/ui/issues/issue-87707.rs
@@ -0,0 +1,15 @@
+// test for #87707
+// edition:2018
+// run-fail
+// check-run-results
+
+use std::sync::Once;
+use std::panic;
+
+fn main() {
+    let o = Once::new();
+    let _ = panic::catch_unwind(|| {
+        o.call_once(|| panic!("Here Once instance is poisoned."));
+    });
+    o.call_once(|| {});
+}
diff --git a/src/test/ui/issues/issue-87707.run.stderr b/src/test/ui/issues/issue-87707.run.stderr
new file mode 100644
index 00000000000..8f82ccc0c2a
--- /dev/null
+++ b/src/test/ui/issues/issue-87707.run.stderr
@@ -0,0 +1,3 @@
+thread 'main' panicked at 'Here Once instance is poisoned.', $DIR/issue-87707.rs:12:24
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+thread 'main' panicked at 'Once instance has previously been poisoned', $DIR/issue-87707.rs:14:7