1 //! Panic support in the standard library.
3 #![stable(feature = "core_panic_info", since = "1.41.0")]
11 #[stable(feature = "panic_hooks", since = "1.10.0")]
12 pub use self::location
::Location
;
13 #[stable(feature = "panic_hooks", since = "1.10.0")]
14 pub use self::panic_info
::PanicInfo
;
15 #[stable(feature = "catch_unwind", since = "1.9.0")]
16 pub use self::unwind_safe
::{AssertUnwindSafe, RefUnwindSafe, UnwindSafe}
;
19 #[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
20 #[allow_internal_unstable(core_panic, const_format_args)]
21 #[rustc_diagnostic_item = "core_panic_2015_macro"]
22 #[rustc_macro_transparency = "semitransparent"]
23 pub macro panic_2015
{
25 $
crate::panicking
::panic("explicit panic")
27 ($msg
:literal $
(,)?
) => (
28 $
crate::panicking
::panic($msg
)
30 // Use `panic_str` instead of `panic_display::<&str>` for non_fmt_panic lint.
31 ($msg
:expr $
(,)?
) => (
32 $
crate::panicking
::panic_str($msg
)
34 // Special-case the single-argument case for const_panic.
35 ("{}", $arg
:expr $
(,)?
) => (
36 $
crate::panicking
::panic_display(&$arg
)
38 ($fmt
:expr
, $
($arg
:tt
)+) => (
39 $
crate::panicking
::panic_fmt($
crate::const_format_args
!($fmt
, $
($arg
)+))
44 #[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
45 #[allow_internal_unstable(core_panic, const_format_args)]
46 #[rustc_diagnostic_item = "core_panic_2021_macro"]
47 #[rustc_macro_transparency = "semitransparent"]
48 pub macro panic_2021
{
50 $
crate::panicking
::panic("explicit panic")
52 // Special-case the single-argument case for const_panic.
53 ("{}", $arg
:expr $
(,)?
) => (
54 $
crate::panicking
::panic_display(&$arg
)
57 $
crate::panicking
::panic_fmt($
crate::const_format_args
!($
($t
)+))
62 #[unstable(feature = "edition_panic", issue = "none", reason = "use unreachable!() instead")]
63 #[allow_internal_unstable(core_panic)]
64 #[rustc_diagnostic_item = "unreachable_2015_macro"]
65 #[rustc_macro_transparency = "semitransparent"]
66 pub macro unreachable_2015
{
68 $
crate::panicking
::panic("internal error: entered unreachable code")
70 // Use of `unreachable_display` for non_fmt_panic lint.
71 // NOTE: the message ("internal error ...") is embedded directly in unreachable_display
72 ($msg
:expr $
(,)?
) => (
73 $
crate::panicking
::unreachable_display(&$msg
)
75 ($fmt
:expr
, $
($arg
:tt
)*) => (
76 $
crate::panic
!($
crate::concat
!("internal error: entered unreachable code: ", $fmt
), $
($arg
)*)
81 #[unstable(feature = "edition_panic", issue = "none", reason = "use unreachable!() instead")]
82 #[allow_internal_unstable(core_panic)]
83 #[rustc_macro_transparency = "semitransparent"]
84 pub macro unreachable_2021
{
86 $
crate::panicking
::panic("internal error: entered unreachable code")
89 $
crate::panic
!("internal error: entered unreachable code: {}", $
crate::format_args
!($
($t
)+))
93 /// An internal trait used by std to pass data from std to `panic_unwind` and
94 /// other panic runtimes. Not intended to be stabilized any time soon, do not
96 #[unstable(feature = "std_internals", issue = "none")]
98 pub unsafe trait BoxMeUp
{
99 /// Take full ownership of the contents.
100 /// The return type is actually `Box<dyn Any + Send>`, but we cannot use `Box` in core.
102 /// After this method got called, only some dummy default value is left in `self`.
103 /// Calling this method twice, or calling `get` after calling this method, is an error.
105 /// The argument is borrowed because the panic runtime (`__rust_start_panic`) only
106 /// gets a borrowed `dyn BoxMeUp`.
107 fn take_box(&mut self) -> *mut (dyn Any
+ Send
);
109 /// Just borrow the contents.
110 fn get(&mut self) -> &(dyn Any
+ Send
);