@@ -12,3 +12,65 @@ macro_rules! pattern_type {
12
12
/* compiler built-in */
13
13
} ;
14
14
}
15
+
16
+ /// A trait implemented for integer types and `char`.
17
+ /// Useful in the future for generic pattern types, but
18
+ /// used right now to simplify ast lowering of pattern type ranges.
19
+ #[ 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
+ ) ]
26
+ pub trait RangePattern {
27
+ /// Trait version of the inherent `MIN` assoc const.
28
+ #[ cfg_attr( not( bootstrap) , lang = "RangeMin" ) ]
29
+ const MIN : Self ;
30
+
31
+ /// Trait version of the inherent `MIN` assoc const.
32
+ #[ cfg_attr( not( bootstrap) , lang = "RangeMax" ) ]
33
+ const MAX : Self ;
34
+
35
+ /// A compile-time helper to subtract 1 for exclusive ranges.
36
+ #[ cfg_attr( not( bootstrap) , lang = "RangeSub" ) ]
37
+ #[ track_caller]
38
+ fn sub_one ( self ) -> Self ;
39
+ }
40
+
41
+ macro_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
+
59
+ impl_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" ) ]
65
+ impl 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
+ }
0 commit comments