#check #unreachable #debug-mode #switch #profile #debugging #build

dbg_unreachable

Switch between unreachable! and unreachable_unchecked with a single macro

3 releases

0.1.2 Jul 11, 2024
0.1.1 Jul 11, 2024
0.1.0 Jul 11, 2024

#823 in Rust patterns


Used in 2 crates (via rb64)

MIT license

5KB

Debug Unreachable

This crate defines an unreachable! macro that is conditionally compiled depending on the build profile. If the build is debug , it translates to core::unreachable If the build is release, it translates to core::hint::unreachable_unchecked There are cases where unreachable_unchecked is faster that unreachable. This macro uses the unchecked version on release mode, but still checks on debug mode, allowing you to catch cases in which the unreachable code is reached.


lib.rs:

This crate defines an [unreachable!] macro that is conditionally compiled depending on the build profile.

If the build is debug , it translates to core::unreachable

If the build is release, it translates to core::hint::unreachable_unchecked

There are cases where unreachable_unchecked is faster that unreachable. This macro uses the unchecked version on release mode, but still checks on debug mode, allowing you to catch cases in which the unreachable code is reached.

Example

use dbg_unreachable::unreachable;

let a = Some(12_i32);
match a {
    Some(n) if n >= 0 => {},
    Some(n) if n < 0 => {},
    Some(_) => unreachable!("The two arms above cover all possible cases"),
    None => {},
}

The piece of code above translates to this two pieces.

Debug

use dbg_unreachable::unreachable;

let a = Some(12_i32);
match a {
    Some(n) if n >= 0 => {},
    Some(n) if n < 0 => {},
    Some(_) => core::unreachable!("The two arms above cover all possible cases"),
    None => {},
}

Release

use dbg_unreachable::unreachable;

let a = Some(12_i32);
match a {
    Some(n) if n >= 0 => {},
    Some(n) if n < 0 => {},
    Some(_) => unsafe { core::hint::unreachable_unchecked() },
    None => {},
}

No runtime deps