Fix invalid special casing of the unreachable! macro
This commit is contained in:
parent
86f5e177bc
commit
565710b33c
15 changed files with 140 additions and 19 deletions
|
@ -594,6 +594,22 @@ macro_rules! writeln {
|
|||
/// unreachable!("The loop should always return");
|
||||
/// }
|
||||
/// ```
|
||||
#[cfg(not(bootstrap))]
|
||||
#[macro_export]
|
||||
#[rustc_builtin_macro(unreachable)]
|
||||
#[allow_internal_unstable(edition_panic)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "unreachable_macro")]
|
||||
macro_rules! unreachable {
|
||||
// Expands to either `$crate::panic::unreachable_2015` or `$crate::panic::unreachable_2021`
|
||||
// depending on the edition of the caller.
|
||||
($($arg:tt)*) => {
|
||||
/* compiler built-in */
|
||||
};
|
||||
}
|
||||
|
||||
/// unreachable!() macro
|
||||
#[cfg(bootstrap)]
|
||||
#[macro_export]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "unreachable_macro")]
|
||||
|
|
|
@ -58,6 +58,39 @@ pub macro panic_2021 {
|
|||
),
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "edition_panic", issue = "none", reason = "use unreachable!() instead")]
|
||||
#[allow_internal_unstable(core_panic)]
|
||||
#[rustc_diagnostic_item = "unreachable_2015_macro"]
|
||||
#[rustc_macro_transparency = "semitransparent"]
|
||||
pub macro unreachable_2015 {
|
||||
() => (
|
||||
$crate::panicking::panic("internal error: entered unreachable code")
|
||||
),
|
||||
// Use of `unreachable_display` for non_fmt_panic lint.
|
||||
// NOTE: the message ("internal error ...") is embeded directly in unreachable_display
|
||||
($msg:expr $(,)?) => (
|
||||
$crate::panicking::unreachable_display(&$msg)
|
||||
),
|
||||
($fmt:expr, $($arg:tt)*) => (
|
||||
$crate::panic!($crate::concat!("internal error: entered unreachable code: ", $fmt), $($arg)*)
|
||||
),
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "edition_panic", issue = "none", reason = "use unreachable!() instead")]
|
||||
#[allow_internal_unstable(core_panic)]
|
||||
#[rustc_diagnostic_item = "unreachable_2021_macro"]
|
||||
#[rustc_macro_transparency = "semitransparent"]
|
||||
pub macro unreachable_2021 {
|
||||
() => (
|
||||
$crate::panicking::panic("internal error: entered unreachable code")
|
||||
),
|
||||
($($t:tt)+) => (
|
||||
$crate::panic!("internal error: entered unreachable code: {}", $crate::format_args!($($t)+))
|
||||
),
|
||||
}
|
||||
|
||||
/// An internal trait used by libstd to pass data from libstd to `panic_unwind`
|
||||
/// and other panic runtimes. Not intended to be stabilized any time soon, do
|
||||
/// not use.
|
||||
|
|
|
@ -56,6 +56,14 @@ pub const fn panic_str(expr: &str) -> ! {
|
|||
panic_display(&expr);
|
||||
}
|
||||
|
||||
#[cfg(not(bootstrap))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
#[rustc_diagnostic_item = "unreachable_display"] // needed for `non-fmt-panics` lint
|
||||
pub fn unreachable_display<T: fmt::Display>(x: &T) -> ! {
|
||||
panic_fmt(format_args!("internal error: entered unreachable code: {}", *x));
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
#[lang = "panic_display"] // needed for const-evaluated panics
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue