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}