@@ -12,3 +12,65 @@ macro_rules! pattern_type {
1212        /* compiler built-in */ 
1313    } ; 
1414} 
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