@@ -204,10 +204,10 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
204204 #[ instrument( level = "debug" , skip( self ) , ret) ]
205205 pub fn ctors_for_ty ( & self , ty : Ty < ' tcx > ) -> ConstructorSet {
206206 let cx = self ;
207- let make_range = |start, end| {
207+ let make_uint_range = |start, end| {
208208 IntRange :: from_range (
209- MaybeInfiniteInt :: new_finite ( cx . tcx , ty , start) ,
210- MaybeInfiniteInt :: new_finite ( cx . tcx , ty , end) ,
209+ MaybeInfiniteInt :: new_finite_uint ( start) ,
210+ MaybeInfiniteInt :: new_finite_uint ( end) ,
211211 RangeEnd :: Included ,
212212 )
213213 } ;
@@ -218,8 +218,8 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
218218 ty:: Char => {
219219 // The valid Unicode Scalar Value ranges.
220220 ConstructorSet :: Integers {
221- range_1 : make_range ( '\u{0000}' as u128 , '\u{D7FF}' as u128 ) ,
222- range_2 : Some ( make_range ( '\u{E000}' as u128 , '\u{10FFFF}' as u128 ) ) ,
221+ range_1 : make_uint_range ( '\u{0000}' as u128 , '\u{D7FF}' as u128 ) ,
222+ range_2 : Some ( make_uint_range ( '\u{E000}' as u128 , '\u{10FFFF}' as u128 ) ) ,
223223 }
224224 }
225225 & ty:: Int ( ity) => {
@@ -230,22 +230,24 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
230230 hi : MaybeInfiniteInt :: PosInfinity ,
231231 }
232232 } else {
233- let bits = Integer :: from_int_ty ( & cx. tcx , ity) . size ( ) . bits ( ) as u128 ;
234- let min = 1u128 << ( bits - 1 ) ;
233+ let size = Integer :: from_int_ty ( & cx. tcx , ity) . size ( ) . bits ( ) ;
234+ let min = 1u128 << ( size - 1 ) ;
235235 let max = min - 1 ;
236- make_range ( min, max)
236+ let min = MaybeInfiniteInt :: new_finite_int ( min, size) ;
237+ let max = MaybeInfiniteInt :: new_finite_int ( max, size) ;
238+ IntRange :: from_range ( min, max, RangeEnd :: Included )
237239 } ;
238240 ConstructorSet :: Integers { range_1 : range, range_2 : None }
239241 }
240242 & ty:: Uint ( uty) => {
241243 let range = if ty. is_ptr_sized_integral ( ) {
242244 // The max value of `usize` is not allowed to be observed.
243- let lo = MaybeInfiniteInt :: new_finite ( cx . tcx , ty , 0 ) ;
245+ let lo = MaybeInfiniteInt :: new_finite_uint ( 0 ) ;
244246 IntRange { lo, hi : MaybeInfiniteInt :: PosInfinity }
245247 } else {
246248 let size = Integer :: from_uint_ty ( & cx. tcx , uty) . size ( ) ;
247249 let max = size. truncate ( u128:: MAX ) ;
248- make_range ( 0 , max)
250+ make_uint_range ( 0 , max)
249251 } ;
250252 ConstructorSet :: Integers { range_1 : range, range_2 : None }
251253 }
@@ -329,7 +331,13 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
329331 PatRangeBoundary :: NegInfinity => MaybeInfiniteInt :: NegInfinity ,
330332 PatRangeBoundary :: Finite ( value) => {
331333 let bits = value. eval_bits ( self . tcx , self . param_env ) ;
332- MaybeInfiniteInt :: new_finite ( self . tcx , ty, bits)
334+ match * ty. kind ( ) {
335+ ty:: Int ( ity) => {
336+ let size = Integer :: from_int_ty ( & self . tcx , ity) . size ( ) . bits ( ) ;
337+ MaybeInfiniteInt :: new_finite_int ( bits, size)
338+ }
339+ _ => MaybeInfiniteInt :: new_finite_uint ( bits) ,
340+ }
333341 }
334342 PatRangeBoundary :: PosInfinity => MaybeInfiniteInt :: PosInfinity ,
335343 }
@@ -428,7 +436,16 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
428436 }
429437 ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
430438 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
431- Some ( bits) => IntRange ( IntRange :: from_bits ( cx. tcx , pat. ty , bits) ) ,
439+ Some ( bits) => {
440+ let x = match * pat. ty . kind ( ) {
441+ ty:: Int ( ity) => {
442+ let size = Integer :: from_int_ty ( & cx. tcx , ity) . size ( ) . bits ( ) ;
443+ MaybeInfiniteInt :: new_finite_int ( bits, size)
444+ }
445+ _ => MaybeInfiniteInt :: new_finite_uint ( bits) ,
446+ } ;
447+ IntRange ( IntRange :: from_singleton ( x) )
448+ }
432449 None => Opaque ( OpaqueId :: new ( ) ) ,
433450 } ;
434451 fields = & [ ] ;
@@ -559,10 +576,12 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
559576 let tcx = self . tcx ;
560577 match miint {
561578 NegInfinity => PatRangeBoundary :: NegInfinity ,
562- Finite ( x) => {
563- let bias = MaybeInfiniteInt :: signed_bias ( tcx, ty) ;
564- let bits = x ^ bias;
579+ Finite ( _) => {
565580 let size = ty. primitive_size ( tcx) ;
581+ let bits = match * ty. kind ( ) {
582+ ty:: Int ( _) => miint. as_finite_int ( size. bits ( ) ) . unwrap ( ) ,
583+ _ => miint. as_finite_uint ( ) . unwrap ( ) ,
584+ } ;
566585 match Scalar :: try_from_uint ( bits, size) {
567586 Some ( scalar) => {
568587 let value = mir:: Const :: from_scalar ( tcx, scalar, ty) ;
0 commit comments