#![cfg_attr(not(feature = "std"), no_std)]
#[macro_export]
macro_rules! inconceivable {
() => {
{
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", not(feature = "std")))]
{
unsafe{ core::hint::unreachable_unchecked() }
}
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", feature = "std"))]
{
unsafe{ std::hint::unreachable_unchecked() }
}
#[cfg(not(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27")))]
{
unreachable!()
}
}
};
($msg: expr) => {
{
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", not(feature = "std")))]
{
unsafe{ core::hint::unreachable_unchecked() }
}
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", feature = "std"))]
{
unsafe{ std::hint::unreachable_unchecked() }
}
#[cfg(not(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27")))]
{
unreachable!($msg)
}
}
};
($msg: expr,) => {
{
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", not(feature = "std")))]
{
unsafe{ core::hint::unreachable_unchecked() }
}
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", feature = "std"))]
{
unsafe{ std::hint::unreachable_unchecked() }
}
#[cfg(not(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27")))]
{
unreachable!($msg)
}
}
};
($fmt: expr, $($arg:tt)*) => {
{
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", not(feature = "std")))]
{
unsafe{ core::hint::unreachable_unchecked() }
}
#[cfg(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27", feature = "std"))]
{
unsafe{ std::hint::unreachable_unchecked() }
}
#[cfg(not(all(feature = "ub_inconceivable", feature = "RUSTC_VERSION_GE_1_27")))]
{
unreachable!($fmt, $($arg)*)
}
}
};
}
#[cfg(test)]
mod test {
#[cfg(not(feature = "ub_inconceivable"))]
#[test]
#[should_panic]
fn test_expansion() {
match 10usize {
1 => {}
_ => inconceivable!(),
};
}
}