@@ -832,15 +832,15 @@ pub enum PatKind<'tcx> {
832832 } ,
833833
834834 /// One of the following:
835- /// * `&str` (represented as a valtree) , which will be handled as a string pattern and thus
835+ /// * `&str`, which will be handled as a string pattern and thus
836836 /// exhaustiveness checking will detect if you use the same string twice in different
837837 /// patterns.
838- /// * integer, bool, char or float (represented as a valtree) , which will be handled by
838+ /// * integer, bool, char or float, which will be handled by
839839 /// exhaustiveness to cover exactly its own value, similar to `&str`, but these values are
840840 /// much simpler.
841841 /// * `String`, if `string_deref_patterns` is enabled.
842842 Constant {
843- value : mir :: Const < ' tcx > ,
843+ value : ty :: Value < ' tcx > ,
844844 } ,
845845
846846 /// Pattern obtained by converting a constant (inline or named) to its pattern
@@ -933,7 +933,7 @@ impl<'tcx> PatRange<'tcx> {
933933 let lo_is_min = match self . lo {
934934 PatRangeBoundary :: NegInfinity => true ,
935935 PatRangeBoundary :: Finite ( value) => {
936- let lo = value. try_to_bits ( size ) . unwrap ( ) ^ bias;
936+ let lo = value. try_to_scalar_int ( ) . unwrap ( ) . to_bits ( size ) ^ bias;
937937 lo <= min
938938 }
939939 PatRangeBoundary :: PosInfinity => false ,
@@ -942,7 +942,7 @@ impl<'tcx> PatRange<'tcx> {
942942 let hi_is_max = match self . hi {
943943 PatRangeBoundary :: NegInfinity => false ,
944944 PatRangeBoundary :: Finite ( value) => {
945- let hi = value. try_to_bits ( size ) . unwrap ( ) ^ bias;
945+ let hi = value. try_to_scalar_int ( ) . unwrap ( ) . to_bits ( size ) ^ bias;
946946 hi > max || hi == max && self . end == RangeEnd :: Included
947947 }
948948 PatRangeBoundary :: PosInfinity => true ,
@@ -955,22 +955,17 @@ impl<'tcx> PatRange<'tcx> {
955955 }
956956
957957 #[ inline]
958- pub fn contains (
959- & self ,
960- value : mir:: Const < ' tcx > ,
961- tcx : TyCtxt < ' tcx > ,
962- typing_env : ty:: TypingEnv < ' tcx > ,
963- ) -> Option < bool > {
958+ pub fn contains ( & self , value : ty:: Value < ' tcx > , tcx : TyCtxt < ' tcx > ) -> Option < bool > {
964959 use Ordering :: * ;
965- debug_assert_eq ! ( self . ty, value. ty( ) ) ;
960+ debug_assert_eq ! ( self . ty, value. ty) ;
966961 let ty = self . ty ;
967962 let value = PatRangeBoundary :: Finite ( value) ;
968963 // For performance, it's important to only do the second comparison if necessary.
969964 Some (
970- match self . lo . compare_with ( value, ty, tcx, typing_env ) ? {
965+ match self . lo . compare_with ( value, ty, tcx) ? {
971966 Less | Equal => true ,
972967 Greater => false ,
973- } && match value. compare_with ( self . hi , ty, tcx, typing_env ) ? {
968+ } && match value. compare_with ( self . hi , ty, tcx) ? {
974969 Less => true ,
975970 Equal => self . end == RangeEnd :: Included ,
976971 Greater => false ,
@@ -979,21 +974,16 @@ impl<'tcx> PatRange<'tcx> {
979974 }
980975
981976 #[ inline]
982- pub fn overlaps (
983- & self ,
984- other : & Self ,
985- tcx : TyCtxt < ' tcx > ,
986- typing_env : ty:: TypingEnv < ' tcx > ,
987- ) -> Option < bool > {
977+ pub fn overlaps ( & self , other : & Self , tcx : TyCtxt < ' tcx > ) -> Option < bool > {
988978 use Ordering :: * ;
989979 debug_assert_eq ! ( self . ty, other. ty) ;
990980 // For performance, it's important to only do the second comparison if necessary.
991981 Some (
992- match other. lo . compare_with ( self . hi , self . ty , tcx, typing_env ) ? {
982+ match other. lo . compare_with ( self . hi , self . ty , tcx) ? {
993983 Less => true ,
994984 Equal => self . end == RangeEnd :: Included ,
995985 Greater => false ,
996- } && match self . lo . compare_with ( other. hi , self . ty , tcx, typing_env ) ? {
986+ } && match self . lo . compare_with ( other. hi , self . ty , tcx) ? {
997987 Less => true ,
998988 Equal => other. end == RangeEnd :: Included ,
999989 Greater => false ,
@@ -1022,7 +1012,7 @@ impl<'tcx> fmt::Display for PatRange<'tcx> {
10221012/// If present, the const must be of a numeric type.
10231013#[ derive( Copy , Clone , Debug , PartialEq , HashStable , TypeVisitable ) ]
10241014pub enum PatRangeBoundary < ' tcx > {
1025- Finite ( mir :: Const < ' tcx > ) ,
1015+ Finite ( ty :: Value < ' tcx > ) ,
10261016 NegInfinity ,
10271017 PosInfinity ,
10281018}
@@ -1033,20 +1023,15 @@ impl<'tcx> PatRangeBoundary<'tcx> {
10331023 matches ! ( self , Self :: Finite ( ..) )
10341024 }
10351025 #[ inline]
1036- pub fn as_finite ( self ) -> Option < mir :: Const < ' tcx > > {
1026+ pub fn as_finite ( self ) -> Option < ty :: Value < ' tcx > > {
10371027 match self {
10381028 Self :: Finite ( value) => Some ( value) ,
10391029 Self :: NegInfinity | Self :: PosInfinity => None ,
10401030 }
10411031 }
1042- pub fn eval_bits (
1043- self ,
1044- ty : Ty < ' tcx > ,
1045- tcx : TyCtxt < ' tcx > ,
1046- typing_env : ty:: TypingEnv < ' tcx > ,
1047- ) -> u128 {
1032+ pub fn eval_bits ( self , ty : Ty < ' tcx > , tcx : TyCtxt < ' tcx > ) -> u128 {
10481033 match self {
1049- Self :: Finite ( value) => value. eval_bits ( tcx , typing_env ) ,
1034+ Self :: Finite ( value) => value. try_to_scalar_int ( ) . unwrap ( ) . to_bits_unchecked ( ) ,
10501035 Self :: NegInfinity => {
10511036 // Unwrap is ok because the type is known to be numeric.
10521037 ty. numeric_min_and_max_as_bits ( tcx) . unwrap ( ) . 0
@@ -1058,14 +1043,8 @@ impl<'tcx> PatRangeBoundary<'tcx> {
10581043 }
10591044 }
10601045
1061- #[ instrument( skip( tcx, typing_env) , level = "debug" , ret) ]
1062- pub fn compare_with (
1063- self ,
1064- other : Self ,
1065- ty : Ty < ' tcx > ,
1066- tcx : TyCtxt < ' tcx > ,
1067- typing_env : ty:: TypingEnv < ' tcx > ,
1068- ) -> Option < Ordering > {
1046+ #[ instrument( skip( tcx) , level = "debug" , ret) ]
1047+ pub fn compare_with ( self , other : Self , ty : Ty < ' tcx > , tcx : TyCtxt < ' tcx > ) -> Option < Ordering > {
10691048 use PatRangeBoundary :: * ;
10701049 match ( self , other) {
10711050 // When comparing with infinities, we must remember that `0u8..` and `0u8..=255`
@@ -1093,8 +1072,8 @@ impl<'tcx> PatRangeBoundary<'tcx> {
10931072 _ => { }
10941073 }
10951074
1096- let a = self . eval_bits ( ty, tcx, typing_env ) ;
1097- let b = other. eval_bits ( ty, tcx, typing_env ) ;
1075+ let a = self . eval_bits ( ty, tcx) ;
1076+ let b = other. eval_bits ( ty, tcx) ;
10981077
10991078 match ty. kind ( ) {
11001079 ty:: Float ( ty:: FloatTy :: F16 ) => {
0 commit comments