From 565710b33cb20c901b8b3371d1364cf7fb11e79b Mon Sep 17 00:00:00 2001 From: Loïc BRANSTETT Date: Fri, 21 Jan 2022 23:04:06 +0100 Subject: Fix invalid special casing of the unreachable! macro --- library/core/src/macros/mod.rs | 16 ++++++++++++++++ library/core/src/panic.rs | 33 +++++++++++++++++++++++++++++++++ library/core/src/panicking.rs | 8 ++++++++ 3 files changed, 57 insertions(+) (limited to 'library/core') diff --git a/library/core/src/macros/mod.rs b/library/core/src/macros/mod.rs index 0cc428d6962..a9e90556f6c 100644 --- a/library/core/src/macros/mod.rs +++ b/library/core/src/macros/mod.rs @@ -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")] diff --git a/library/core/src/panic.rs b/library/core/src/panic.rs index 7a8b04d6f3c..0be3f06ff6c 100644 --- a/library/core/src/panic.rs +++ b/library/core/src/panic.rs @@ -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. diff --git a/library/core/src/panicking.rs b/library/core/src/panicking.rs index 5078eea07a1..d857b4948b5 100644 --- a/library/core/src/panicking.rs +++ b/library/core/src/panicking.rs @@ -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(x: &T) -> ! { + panic_fmt(format_args!("internal error: entered unreachable code: {}", *x)); +} + #[inline] #[track_caller] #[lang = "panic_display"] // needed for const-evaluated panics -- cgit 1.4.1-3-g733a5