1#![stable(feature = "core_panic_info", since = "1.41.0")]
4
5mod location;
6#[cfg(not(feature = "ferrocene_certified"))]
7mod panic_info;
8#[cfg(not(feature = "ferrocene_certified"))]
9mod unwind_safe;
10
11#[stable(feature = "panic_hooks", since = "1.10.0")]
12pub use self::location::Location;
13#[stable(feature = "panic_hooks", since = "1.10.0")]
14#[cfg(not(feature = "ferrocene_certified"))]
15pub use self::panic_info::PanicInfo;
16#[stable(feature = "panic_info_message", since = "1.81.0")]
17#[cfg(not(feature = "ferrocene_certified"))]
18pub use self::panic_info::PanicMessage;
19#[stable(feature = "catch_unwind", since = "1.9.0")]
20#[cfg(not(feature = "ferrocene_certified"))]
21pub use self::unwind_safe::{AssertUnwindSafe, RefUnwindSafe, UnwindSafe};
22#[cfg(not(feature = "ferrocene_certified"))]
23use crate::any::Any;
24
25#[doc(hidden)]
26#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
27#[allow_internal_unstable(panic_internals, const_format_args)]
28#[rustc_diagnostic_item = "core_panic_2015_macro"]
29#[rustc_macro_transparency = "semitransparent"]
30#[cfg(not(feature = "ferrocene_certified"))]
31pub macro panic_2015 {
32 () => (
33 $crate::panicking::panic("explicit panic")
34 ),
35 ($msg:literal $(,)?) => (
36 $crate::panicking::panic($msg)
37 ),
38 ($msg:expr $(,)?) => ({
40 $crate::panicking::panic_str_2015($msg);
41 }),
42 ("{}", $arg:expr $(,)?) => ({
44 $crate::panicking::panic_display(&$arg);
45 }),
46 ($fmt:expr, $($arg:tt)+) => ({
47 $crate::panicking::panic_fmt($crate::const_format_args!($fmt, $($arg)+));
50 }),
51}
52
53#[doc(hidden)]
54#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
55#[allow_internal_unstable(panic_internals, const_format_args)]
56#[rustc_diagnostic_item = "core_panic_2021_macro"]
57#[rustc_macro_transparency = "semitransparent"]
58#[cfg(all(feature = "ferrocene_certified", feature = "panic_immediate_abort"))]
59pub macro panic_2021($($t:tt)*) {{ $crate::panicking::panic("explicit panic") }}
60
61#[doc(hidden)]
62#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
63#[allow_internal_unstable(panic_internals, const_format_args)]
64#[rustc_diagnostic_item = "core_panic_2021_macro"]
65#[rustc_macro_transparency = "semitransparent"]
66#[cfg(feature = "panic_immediate_abort")]
67#[cfg(not(feature = "ferrocene_certified"))]
68pub macro panic_2021 {
69 () => (
70 $crate::panicking::panic("explicit panic")
71 ),
72 ("{}", $arg:expr $(,)?) => ({
74 $crate::panicking::panic_display(&$arg);
75 }),
76 ($($t:tt)+) => ({
77 $crate::panicking::panic_fmt($crate::const_format_args!($($t)+));
80 }),
81}
82
83#[doc(hidden)]
84#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
85#[allow_internal_unstable(
86 panic_internals,
87 core_intrinsics,
88 const_dispatch,
89 const_eval_select,
90 const_format_args,
91 rustc_attrs
92)]
93#[rustc_diagnostic_item = "core_panic_2021_macro"]
94#[rustc_macro_transparency = "semitransparent"]
95#[cfg(not(feature = "panic_immediate_abort"))]
96#[cfg(not(feature = "ferrocene_certified"))]
97pub macro panic_2021 {
98 () => ({
99 #[cold]
102 #[track_caller]
103 #[inline(never)]
104 const fn panic_cold_explicit() -> ! {
105 $crate::panicking::panic_explicit()
106 }
107 panic_cold_explicit();
108 }),
109 ("{}", $arg:expr $(,)?) => ({
111 #[cold]
112 #[track_caller]
113 #[inline(never)]
114 #[rustc_const_panic_str] #[rustc_do_not_const_check] const fn panic_cold_display<T: $crate::fmt::Display>(arg: &T) -> ! {
117 $crate::panicking::panic_display(arg)
118 }
119 panic_cold_display(&$arg);
120 }),
121 ($($t:tt)+) => ({
122 $crate::panicking::panic_fmt($crate::const_format_args!($($t)+));
125 }),
126}
127
128#[doc(hidden)]
129#[unstable(feature = "edition_panic", issue = "none", reason = "use unreachable!() instead")]
130#[allow_internal_unstable(panic_internals)]
131#[rustc_diagnostic_item = "unreachable_2015_macro"]
132#[rustc_macro_transparency = "semitransparent"]
133#[cfg(not(feature = "ferrocene_certified"))]
134pub macro unreachable_2015 {
135 () => (
136 $crate::panicking::panic("internal error: entered unreachable code")
137 ),
138 ($msg:expr $(,)?) => ({
141 $crate::panicking::unreachable_display(&$msg);
142 }),
143 ($fmt:expr, $($arg:tt)*) => (
144 $crate::panic!($crate::concat!("internal error: entered unreachable code: ", $fmt), $($arg)*)
145 ),
146}
147
148#[doc(hidden)]
149#[unstable(feature = "edition_panic", issue = "none", reason = "use unreachable!() instead")]
150#[allow_internal_unstable(panic_internals)]
151#[rustc_macro_transparency = "semitransparent"]
152#[cfg(not(feature = "ferrocene_certified"))]
153pub macro unreachable_2021 {
154 () => (
155 $crate::panicking::panic("internal error: entered unreachable code")
156 ),
157 ($($t:tt)+) => (
158 $crate::panic!("internal error: entered unreachable code: {}", $crate::format_args!($($t)+))
159 ),
160}
161
162#[unstable(feature = "abort_unwind", issue = "130338")]
182#[rustc_nounwind]
183#[cfg(not(feature = "ferrocene_certified"))]
184pub fn abort_unwind<F: FnOnce() -> R, R>(f: F) -> R {
185 f()
186}
187
188#[unstable(feature = "std_internals", issue = "none")]
192#[doc(hidden)]
193#[cfg(not(feature = "ferrocene_certified"))]
194pub unsafe trait PanicPayload: crate::fmt::Display {
195 fn take_box(&mut self) -> *mut (dyn Any + Send);
204
205 fn get(&mut self) -> &(dyn Any + Send);
207
208 fn as_str(&mut self) -> Option<&str> {
210 None
211 }
212}
213
214#[unstable(feature = "panic_internals", issue = "none")]
223#[doc(hidden)]
224#[cfg(not(feature = "ferrocene_certified"))]
225pub macro const_panic {
226 ($const_msg:literal, $runtime_msg:literal, $($arg:ident : $ty:ty = $val:expr),* $(,)?) => {{
227 #[rustc_allow_const_fn_unstable(const_eval_select)]
231 #[inline(always)] #[track_caller]
233 const fn do_panic($($arg: $ty),*) -> ! {
234 $crate::intrinsics::const_eval_select!(
235 @capture { $($arg: $ty = $arg),* } -> !:
236 #[noinline]
237 if const #[track_caller] #[inline] { $crate::panic!($const_msg)
239 } else #[track_caller] { $crate::panic!($runtime_msg)
241 }
242 )
243 }
244
245 do_panic($($val),*)
246 }},
247 ($const_msg:literal, $runtime_msg:literal, $($arg:ident : $ty:ty),* $(,)?) => {
250 $crate::panic::const_panic!(
251 $const_msg,
252 $runtime_msg,
253 $($arg: $ty = $arg),*
254 )
255 },
256}
257
258#[unstable(feature = "panic_internals", issue = "none")]
262#[doc(hidden)]
263#[cfg(not(feature = "ferrocene_certified"))]
264pub macro const_assert {
265 ($condition: expr, $const_msg:literal, $runtime_msg:literal, $($arg:tt)*) => {{
266 if !$crate::intrinsics::likely($condition) {
267 $crate::panic::const_panic!($const_msg, $runtime_msg, $($arg)*)
268 }
269 }}
270}