1#[macro_export]
8#[rustc_builtin_macro(pattern_type)]
9#[unstable(feature = "pattern_type_macro", issue = "123646")]
10macro_rules! pattern_type {
11    ($($arg:tt)*) => {
12        };
14}
15
16#[unstable(feature = "pattern_type_range_trait", issue = "123646")]
20#[rustc_const_unstable(feature = "pattern_type_range_trait", issue = "123646")]
21#[const_trait]
22#[diagnostic::on_unimplemented(
23    message = "`{Self}` is not a valid base type for range patterns",
24    label = "only integer types and `char` are supported"
25)]
26pub trait RangePattern {
27    #[cfg_attr(not(bootstrap), lang = "RangeMin")]
29    const MIN: Self;
30
31    #[cfg_attr(not(bootstrap), lang = "RangeMax")]
33    const MAX: Self;
34
35    #[cfg_attr(not(bootstrap), lang = "RangeSub")]
37    #[track_caller]
38    fn sub_one(self) -> Self;
39}
40
41macro_rules! impl_range_pat {
42    ($($ty:ty,)*) => {
43        $(
44            #[rustc_const_unstable(feature = "pattern_type_range_trait", issue = "123646")]
45            impl const RangePattern for $ty {
46                const MIN: $ty = <$ty>::MIN;
47                const MAX: $ty = <$ty>::MAX;
48                fn sub_one(self) -> Self {
49                    match self.checked_sub(1) {
50                        Some(val) => val,
51                        None => panic!("exclusive range end at minimum value of type")
52                    }
53                }
54            }
55        )*
56    }
57}
58
59impl_range_pat! {
60    i8, i16, i32, i64, i128, isize,
61    u8, u16, u32, u64, u128, usize,
62}
63
64#[rustc_const_unstable(feature = "pattern_type_range_trait", issue = "123646")]
65impl const RangePattern for char {
66    const MIN: Self = char::MIN;
67
68    const MAX: Self = char::MAX;
69
70    fn sub_one(self) -> Self {
71        match char::from_u32(self as u32 - 1) {
72            None => panic!("exclusive range to start of valid chars"),
73            Some(val) => val,
74        }
75    }
76}