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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#[macro_export]
macro_rules! unreachable {
() => (
$crate::unreachable_with!(Default::default())
);
($msg:expr) => (
$crate::unreachable_with!(Default::default(), $msg)
);
($msg:expr,) => (
$crate::unreachable_with!(Default::default(), $msg)
);
($fmt:expr, $($arg:tt)*) => (
$crate::unreachable_with!(Default::default(), $fmt, $($arg)*)
);
}
#[macro_export]
macro_rules! unreachable_with {
($e:expr) => ({
$crate::log::error!("internal error: entered unreachable code");
$e
});
($e:expr,) => ({
$crate::log::error!("internal error: entered unreachable code");
$e
});
($e:expr, $msg:expr) => ({
$crate::unreachable_with!($e, "{}", $msg)
});
($e:expr, $msg:expr,) => ({
$crate::unreachable_with!($e, $msg)
});
($e:expr, $fmt:expr, $($arg:tt)*) => ({
$crate::log::error!(concat!("internal error: entered unreachable code: ", $fmt), $($arg)*);
$e
});
}
#[cfg(test)]
mod tests {
use crate::unreachable;
#[test]
fn it_works() {
let a: i32 = unreachable!();
assert_eq!(a, 0);
let b: i32 = unreachable!("1");
assert_eq!(b, 0);
let c: i32 = unreachable!("1",);
assert_eq!(c, 0);
let d: i32 = unreachable!("{}{}", 1, 3);
assert_eq!(d, 0);
let e: i32 = unreachable_with!(10);
assert_eq!(e, 10);
let f: i32 = unreachable_with!(10,);
assert_eq!(f, 10);
let g: i32 = unreachable_with!(10, "123");
assert_eq!(g, 10);
let h: i32 = unreachable_with!(10, "123",);
assert_eq!(h, 10);
let i: i32 = unreachable_with!(10, "{}", 1);
assert_eq!(i, 10);
let j: i32 = unreachable_with!(10, "{}", 1,);
assert_eq!(j, 10);
}
}