Add PanicMessage type for PanicInfo::message(). · model-checking/verify-rust-std@ca458ba (original) (raw)
1
``
`-
use crate::fmt;
`
``
1
`+
use crate::fmt::{self, Display};
`
2
2
`use crate::panic::Location;
`
3
3
``
4
4
`/// A struct providing information about a panic.
`
`@@ -18,6 +18,17 @@ pub struct PanicInfo<'a> {
`
18
18
`force_no_backtrace: bool,
`
19
19
`}
`
20
20
``
``
21
`` +
/// A message that was given to the panic!()
macro.
``
``
22
`+
///
`
``
23
`` +
/// The [Display
] implementation of this type will format the message with the arguments
``
``
24
`` +
/// that were given to the panic!()
macro.
``
``
25
`+
///
`
``
26
`` +
/// See [PanicInfo::message
].
``
``
27
`+
#[unstable(feature = "panic_info_message", issue = "66745")]
`
``
28
`+
pub struct PanicMessage<'a> {
`
``
29
`+
message: fmt::Arguments<'a>,
`
``
30
`+
}
`
``
31
+
21
32
`impl<'a> PanicInfo<'a> {
`
22
33
`#[inline]
`
23
34
`pub(crate) fn new(
`
`@@ -29,12 +40,26 @@ impl<'a> PanicInfo<'a> {
`
29
40
`PanicInfo { location, message, can_unwind, force_no_backtrace }
`
30
41
`}
`
31
42
``
32
``
`` -
/// The message that was given to the panic!
macro,
``
33
``
`` -
/// ready to be formatted with e.g. [fmt::write
].
``
``
43
`` +
/// The message that was given to the panic!
macro.
``
``
44
`+
///
`
``
45
`+
/// # Example
`
``
46
`+
///
`
``
47
`` +
/// The type returned by this method implements Display
, so it can
``
``
48
`` +
/// be passed directly to [write!()
] and similar macros.
``
``
49
`+
///
`
``
50
`` +
/// [write!()
]: core::write
``
``
51
`+
///
`
``
52
/// ```ignore (no_std)
``
53
`+
/// #[panic_handler]
`
``
54
`+
/// fn panic_handler(panic_info: &PanicInfo<'_>) -> ! {
`
``
55
`+
/// write!(DEBUG_OUTPUT, "panicked: {}", panic_info.message());
`
``
56
`+
/// loop {}
`
``
57
`+
/// }
`
``
58
/// ```
34
59
`#[must_use]
`
35
60
`#[unstable(feature = "panic_info_message", issue = "66745")]
`
36
``
`-
pub fn message(&self) -> fmt::Arguments<'_> {
`
37
``
`-
self.message
`
``
61
`+
pub fn message(&self) -> PanicMessage<'_> {
`
``
62
`+
PanicMessage { message: self.message }
`
38
63
`}
`
39
64
``
40
65
`/// Returns information about the location from which the panic originated,
`
`@@ -116,7 +141,7 @@ impl<'a> PanicInfo<'a> {
`
116
141
`}
`
117
142
``
118
143
`#[stable(feature = "panic_hook_display", since = "1.26.0")]
`
119
``
`-
impl fmt::Display for PanicInfo<'_> {
`
``
144
`+
impl Display for PanicInfo<'_> {
`
120
145
`fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
`
121
146
` formatter.write_str("panicked at ")?;
`
122
147
`self.location.fmt(formatter)?;
`
`@@ -125,3 +150,41 @@ impl fmt::Display for PanicInfo<'_> {
`
125
150
`Ok(())
`
126
151
`}
`
127
152
`}
`
``
153
+
``
154
`+
impl<'a> PanicMessage<'a> {
`
``
155
`+
/// Get the formatted message, if it has no arguments to be formatted at runtime.
`
``
156
`+
///
`
``
157
`+
/// This can be used to avoid allocations in some cases.
`
``
158
`+
///
`
``
159
`+
/// # Guarantees
`
``
160
`+
///
`
``
161
`` +
/// For panic!("just a literal")
, this function is guaranteed to
``
``
162
`` +
/// return Some("just a literal")
.
``
``
163
`+
///
`
``
164
`` +
/// For most cases with placeholders, this function will return None
.
``
``
165
`+
///
`
``
166
`` +
/// See [fmt::Arguments::as_str
] for details.
``
``
167
`+
#[unstable(feature = "panic_info_message", issue = "66745")]
`
``
168
`+
#[rustc_const_unstable(feature = "const_arguments_as_str", issue = "103900")]
`
``
169
`+
#[must_use]
`
``
170
`+
#[inline]
`
``
171
`+
pub const fn as_str(&self) -> Option<&'static str> {
`
``
172
`+
self.message.as_str()
`
``
173
`+
}
`
``
174
`+
}
`
``
175
+
``
176
`+
#[unstable(feature = "panic_info_message", issue = "66745")]
`
``
177
`+
impl Display for PanicMessage<'_> {
`
``
178
`+
#[inline]
`
``
179
`+
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
`
``
180
`+
formatter.write_fmt(self.message)
`
``
181
`+
}
`
``
182
`+
}
`
``
183
+
``
184
`+
#[unstable(feature = "panic_info_message", issue = "66745")]
`
``
185
`+
impl fmt::Debug for PanicMessage<'_> {
`
``
186
`+
#[inline]
`
``
187
`+
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
`
``
188
`+
formatter.write_fmt(self.message)
`
``
189
`+
}
`
``
190
`+
}
`