summaryrefslogtreecommitdiffstats
path: root/third_party/rust/new_debug_unreachable/src
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/new_debug_unreachable/src')
-rw-r--r--third_party/rust/new_debug_unreachable/src/lib.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/third_party/rust/new_debug_unreachable/src/lib.rs b/third_party/rust/new_debug_unreachable/src/lib.rs
new file mode 100644
index 0000000000..db0f968f0a
--- /dev/null
+++ b/third_party/rust/new_debug_unreachable/src/lib.rs
@@ -0,0 +1,36 @@
+#![deny(missing_docs, warnings)]
+
+#![no_std]
+
+//! `panic!()` in debug builds, optimization hint in release.
+
+#[doc(hidden)] pub mod _internal { pub use core::hint::unreachable_unchecked; }
+
+#[macro_export]
+/// `panic!()` in debug builds, optimization hint in release.
+///
+/// Example:
+///
+/// ```
+/// use debug_unreachable::debug_unreachable;
+///
+/// fn main() {
+/// if 0 > 100 {
+/// // Can't happen!
+/// unsafe { debug_unreachable!() }
+/// } else {
+/// println!("Good, 0 <= 100.");
+/// }
+/// }
+/// ```
+macro_rules! debug_unreachable {
+ () => { debug_unreachable!("entered unreachable code") };
+ ($e:expr) => {
+ if cfg!(debug_assertions) {
+ panic!($e)
+ } else {
+ $crate::_internal::unreachable_unchecked()
+ }
+ }
+}
+