| //@ check-pass |
| //@ edition:2021 |
| |
| #![allow(unreachable_code)] |
| |
| use std::fmt::{self, Display}; |
| use std::marker::PhantomData; |
| |
| struct NotSend { |
| marker: PhantomData<*const u8>, |
| } |
| |
| const NOT_SEND: NotSend = NotSend { marker: PhantomData }; |
| |
| impl Display for NotSend { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| formatter.write_str("this value does not implement Send") |
| } |
| } |
| |
| async fn f(_: u8) {} |
| |
| // Exercises this matcher in panic_2021: |
| // ($($t:tt)+) => $crate::panicking::panic_fmt(...) |
| async fn panic_fmt() { |
| // Panic returns `!`, so the await is never reached, and in particular the |
| // temporaries inside the formatting machinery are not still alive at the |
| // await point. |
| let todo = "..."; |
| f(panic!("not yet implemented: {}", todo)).await; |
| } |
| |
| // Exercises ("{}", $arg:expr) => $crate::panicking::panic_display(&$arg) |
| async fn panic_display() { |
| f(panic!("{}", NOT_SEND)).await; |
| } |
| |
| fn require_send(_: impl Send) {} |
| |
| fn main() { |
| require_send(panic_fmt()); |
| require_send(panic_display()); |
| } |