solar_data_structures/
never.rs

1/// Hack to access the never type on stable.
2#[cfg(not(feature = "nightly"))]
3#[doc(hidden)]
4#[allow(unnameable_types)]
5pub trait GetReturnType {
6    type ReturnType;
7}
8
9#[cfg(not(feature = "nightly"))]
10#[doc(hidden)]
11impl<T> GetReturnType for fn() -> T {
12    type ReturnType = T;
13}
14
15/// The [`!` (never)](primitive@never) type.
16#[cfg(not(feature = "nightly"))]
17pub type Never = <fn() -> ! as GetReturnType>::ReturnType;
18
19/// The [`!` (never)](primitive@never) type.
20#[cfg(feature = "nightly")]
21pub type Never = !;
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    fn never_returns() -> Never {
28        panic!();
29    }
30
31    #[test]
32    fn test_never_returns() {
33        #[cfg(feature = "nightly")]
34        fn test1<F: Fn() -> !>(f: F) {
35            let _ = f;
36        }
37        fn test2(f: fn() -> !) {
38            let _ = f;
39        }
40
41        #[cfg(feature = "nightly")]
42        test1(never_returns);
43        test2(never_returns);
44    }
45
46    #[test]
47    fn never() {
48        let r = Ok::<i32, Never>(42);
49
50        // This would be an error if `Never` was not exactly the primitive `!` type.
51        #[allow(clippy::infallible_destructuring_match)]
52        let x = match r {
53            Ok(x) => x,
54        };
55        assert_eq!(x, 42);
56
57        let Ok(x) = r;
58        assert_eq!(x, 42);
59
60        let x = if true { 43 } else { never_returns() };
61        assert_eq!(x, 43);
62    }
63}