mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-04 19:12:50 +00:00
Add a test case for #[track_caller] on async fn
This commit is contained in:
parent
43c22af267
commit
0c158f0e9d
74
src/test/ui/async-await/panic-no-track-caller.rs
Normal file
74
src/test/ui/async-await/panic-no-track-caller.rs
Normal file
@ -0,0 +1,74 @@
|
||||
// run-pass
|
||||
// edition:2021
|
||||
|
||||
use std::future::Future;
|
||||
use std::panic;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::task::{Context, Poll, Wake};
|
||||
use std::thread::{self, Thread};
|
||||
|
||||
/// A waker that wakes up the current thread when called.
|
||||
struct ThreadWaker(Thread);
|
||||
|
||||
impl Wake for ThreadWaker {
|
||||
fn wake(self: Arc<Self>) {
|
||||
self.0.unpark();
|
||||
}
|
||||
}
|
||||
|
||||
/// Run a future to completion on the current thread.
|
||||
fn block_on<T>(fut: impl Future<Output = T>) -> T {
|
||||
// Pin the future so it can be polled.
|
||||
let mut fut = Box::pin(fut);
|
||||
|
||||
// Create a new context to be passed to the future.
|
||||
let t = thread::current();
|
||||
let waker = Arc::new(ThreadWaker(t)).into();
|
||||
let mut cx = Context::from_waker(&waker);
|
||||
|
||||
// Run the future to completion.
|
||||
loop {
|
||||
match fut.as_mut().poll(&mut cx) {
|
||||
Poll::Ready(res) => return res,
|
||||
Poll::Pending => thread::park(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn bar() {
|
||||
panic!()
|
||||
}
|
||||
|
||||
async fn foo() {
|
||||
bar().await
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
async fn bar_track_caller() {
|
||||
panic!()
|
||||
}
|
||||
|
||||
async fn foo_track_caller() {
|
||||
bar_track_caller().await
|
||||
}
|
||||
|
||||
fn panicked_at(f: impl FnOnce() + panic::UnwindSafe) -> u32 {
|
||||
let loc = Arc::new(Mutex::new(None));
|
||||
|
||||
let hook = panic::take_hook();
|
||||
{
|
||||
let loc = loc.clone();
|
||||
panic::set_hook(Box::new(move |info| {
|
||||
*loc.lock().unwrap() = info.location().map(|loc| loc.line())
|
||||
}));
|
||||
}
|
||||
panic::catch_unwind(f).unwrap_err();
|
||||
panic::set_hook(hook);
|
||||
let x = loc.lock().unwrap().unwrap();
|
||||
x
|
||||
}
|
||||
|
||||
fn main() {
|
||||
assert_eq!(panicked_at(|| block_on(foo())), 39);
|
||||
assert_eq!(panicked_at(|| block_on(foo_track_caller())), 52);
|
||||
}
|
Loading…
Reference in New Issue
Block a user