@@ -204,10 +204,10 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
204
204
#[ instrument( level = "debug" , skip( self ) , ret) ]
205
205
pub fn ctors_for_ty ( & self , ty : Ty < ' tcx > ) -> ConstructorSet {
206
206
let cx = self ;
207
- let make_range = |start, end| {
207
+ let make_uint_range = |start, end| {
208
208
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) ,
211
211
RangeEnd :: Included ,
212
212
)
213
213
} ;
@@ -218,8 +218,8 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
218
218
ty:: Char => {
219
219
// The valid Unicode Scalar Value ranges.
220
220
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 ) ) ,
223
223
}
224
224
}
225
225
& ty:: Int ( ity) => {
@@ -230,22 +230,24 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
230
230
hi : MaybeInfiniteInt :: PosInfinity ,
231
231
}
232
232
} 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 ) ;
235
235
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 )
237
239
} ;
238
240
ConstructorSet :: Integers { range_1 : range, range_2 : None }
239
241
}
240
242
& ty:: Uint ( uty) => {
241
243
let range = if ty. is_ptr_sized_integral ( ) {
242
244
// 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 ) ;
244
246
IntRange { lo, hi : MaybeInfiniteInt :: PosInfinity }
245
247
} else {
246
248
let size = Integer :: from_uint_ty ( & cx. tcx , uty) . size ( ) ;
247
249
let max = size. truncate ( u128:: MAX ) ;
248
- make_range ( 0 , max)
250
+ make_uint_range ( 0 , max)
249
251
} ;
250
252
ConstructorSet :: Integers { range_1 : range, range_2 : None }
251
253
}
@@ -329,7 +331,13 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
329
331
PatRangeBoundary :: NegInfinity => MaybeInfiniteInt :: NegInfinity ,
330
332
PatRangeBoundary :: Finite ( value) => {
331
333
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
+ }
333
341
}
334
342
PatRangeBoundary :: PosInfinity => MaybeInfiniteInt :: PosInfinity ,
335
343
}
@@ -428,7 +436,16 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
428
436
}
429
437
ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
430
438
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
+ }
432
449
None => Opaque ( OpaqueId :: new ( ) ) ,
433
450
} ;
434
451
fields = & [ ] ;
@@ -559,10 +576,12 @@ impl<'p, 'tcx> MatchCheckCtxt<'p, 'tcx> {
559
576
let tcx = self . tcx ;
560
577
match miint {
561
578
NegInfinity => PatRangeBoundary :: NegInfinity ,
562
- Finite ( x) => {
563
- let bias = MaybeInfiniteInt :: signed_bias ( tcx, ty) ;
564
- let bits = x ^ bias;
579
+ Finite ( _) => {
565
580
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
+ } ;
566
585
match Scalar :: try_from_uint ( bits, size) {
567
586
Some ( scalar) => {
568
587
let value = mir:: Const :: from_scalar ( tcx, scalar, ty) ;
0 commit comments