1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

/// Panics if reached. This is a variant of the standard library's `unreachable!`
/// macro that is controlled by `cfg!(debug_assertions)`.
///
/// Same as prelude's `unreachable!` in debug builds or release builds where the
/// `-C debug-assertions` was provided to the compiler. For all other builds,
/// vanishes without a trace.
///
/// # Example
///
/// ```rust
/// // You probably wouldn't actually use this here
/// let mut value = 0.5;
/// if value < 0.0 {
///     chek::debug_unreachable!("Value out of range {}", value);
///     value = 0.0;
/// }
/// ```
#[macro_export]
macro_rules! debug_unreachable {
    ($($arg:tt)*) => {
        if cfg!(debug_assertions) {
            unreachable!($($arg)*);
        }
    }
}

/// In debug mode, panics if reached (with `unreachable!`). In release mode, is
/// a `std::hint::unreachable_unchecked()` call. This is `unsafe` to call in
/// both debug and release builds.
///
/// # Example
///
/// ```rust
/// let value = Some(10);
/// // Obviously, be extremely sure you're correct if you use this.
/// let contents = value.unwrap_or_else(|| unsafe {
///     chek::debug_unreachable_unchecked!("optional message")
/// });
/// ```
#[macro_export]
macro_rules! debug_unreachable_unchecked {
    ($($arg:tt)*) => {
        if cfg!(debug_assertions) {
            unreachable!($($arg)*);
        } else {
            $crate::__internal::unreachable_unchecked();
        }
    }
}