@@ -517,78 +517,57 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
517
517
) ,
518
518
}
519
519
}
520
- PatKind :: Constant { value } => {
520
+ PatKind :: Constant { ty : value_ty , value } => {
521
521
match ty. kind ( ) {
522
522
ty:: Bool => {
523
- ctor = match value. try_eval_bool ( cx. tcx , cx. typing_env ) {
524
- Some ( b) => Bool ( b) ,
525
- None => Opaque ( OpaqueId :: new ( ) ) ,
526
- } ;
523
+ ctor = Bool ( value. unwrap_leaf ( ) . try_to_bool ( ) . unwrap ( ) ) ;
527
524
fields = vec ! [ ] ;
528
525
arity = 0 ;
529
526
}
530
527
ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
531
- ctor = match value. try_eval_bits ( cx. tcx , cx. typing_env ) {
532
- Some ( bits) => {
533
- let x = match * ty. kind ( ) {
534
- ty:: Int ( ity) => {
535
- let size = Integer :: from_int_ty ( & cx. tcx , ity) . size ( ) . bits ( ) ;
536
- MaybeInfiniteInt :: new_finite_int ( bits, size)
537
- }
538
- _ => MaybeInfiniteInt :: new_finite_uint ( bits) ,
539
- } ;
540
- IntRange ( IntRange :: from_singleton ( x) )
541
- }
542
- None => Opaque ( OpaqueId :: new ( ) ) ,
528
+ ctor = {
529
+ let bits = value. unwrap_leaf ( ) . to_bits_unchecked ( ) ;
530
+ let x = match * ty. kind ( ) {
531
+ ty:: Int ( ity) => {
532
+ let size = Integer :: from_int_ty ( & cx. tcx , ity) . size ( ) . bits ( ) ;
533
+ MaybeInfiniteInt :: new_finite_int ( bits, size)
534
+ }
535
+ _ => MaybeInfiniteInt :: new_finite_uint ( bits) ,
536
+ } ;
537
+ IntRange ( IntRange :: from_singleton ( x) )
543
538
} ;
544
539
fields = vec ! [ ] ;
545
540
arity = 0 ;
546
541
}
547
542
ty:: Float ( ty:: FloatTy :: F16 ) => {
548
- ctor = match value. try_eval_bits ( cx. tcx , cx. typing_env ) {
549
- Some ( bits) => {
550
- use rustc_apfloat:: Float ;
551
- let value = rustc_apfloat:: ieee:: Half :: from_bits ( bits) ;
552
- F16Range ( value, value, RangeEnd :: Included )
553
- }
554
- None => Opaque ( OpaqueId :: new ( ) ) ,
555
- } ;
543
+ use rustc_apfloat:: Float ;
544
+ let bits = value. unwrap_leaf ( ) . to_u16 ( ) ;
545
+ let value = rustc_apfloat:: ieee:: Half :: from_bits ( bits. into ( ) ) ;
546
+ ctor = F16Range ( value, value, RangeEnd :: Included ) ;
556
547
fields = vec ! [ ] ;
557
548
arity = 0 ;
558
549
}
559
550
ty:: Float ( ty:: FloatTy :: F32 ) => {
560
- ctor = match value. try_eval_bits ( cx. tcx , cx. typing_env ) {
561
- Some ( bits) => {
562
- use rustc_apfloat:: Float ;
563
- let value = rustc_apfloat:: ieee:: Single :: from_bits ( bits) ;
564
- F32Range ( value, value, RangeEnd :: Included )
565
- }
566
- None => Opaque ( OpaqueId :: new ( ) ) ,
567
- } ;
551
+ use rustc_apfloat:: Float ;
552
+ let bits = value. unwrap_leaf ( ) . to_u32 ( ) ;
553
+ let value = rustc_apfloat:: ieee:: Single :: from_bits ( bits. into ( ) ) ;
554
+ ctor = F32Range ( value, value, RangeEnd :: Included ) ;
568
555
fields = vec ! [ ] ;
569
556
arity = 0 ;
570
557
}
571
558
ty:: Float ( ty:: FloatTy :: F64 ) => {
572
- ctor = match value. try_eval_bits ( cx. tcx , cx. typing_env ) {
573
- Some ( bits) => {
574
- use rustc_apfloat:: Float ;
575
- let value = rustc_apfloat:: ieee:: Double :: from_bits ( bits) ;
576
- F64Range ( value, value, RangeEnd :: Included )
577
- }
578
- None => Opaque ( OpaqueId :: new ( ) ) ,
579
- } ;
559
+ use rustc_apfloat:: Float ;
560
+ let bits = value. unwrap_leaf ( ) . to_u64 ( ) ;
561
+ let value = rustc_apfloat:: ieee:: Double :: from_bits ( bits. into ( ) ) ;
562
+ ctor = F64Range ( value, value, RangeEnd :: Included ) ;
580
563
fields = vec ! [ ] ;
581
564
arity = 0 ;
582
565
}
583
566
ty:: Float ( ty:: FloatTy :: F128 ) => {
584
- ctor = match value. try_eval_bits ( cx. tcx , cx. typing_env ) {
585
- Some ( bits) => {
586
- use rustc_apfloat:: Float ;
587
- let value = rustc_apfloat:: ieee:: Quad :: from_bits ( bits) ;
588
- F128Range ( value, value, RangeEnd :: Included )
589
- }
590
- None => Opaque ( OpaqueId :: new ( ) ) ,
591
- } ;
567
+ use rustc_apfloat:: Float ;
568
+ let bits = value. unwrap_leaf ( ) . to_u128 ( ) ;
569
+ let value = rustc_apfloat:: ieee:: Quad :: from_bits ( bits) ;
570
+ ctor = F128Range ( value, value, RangeEnd :: Included ) ;
592
571
fields = vec ! [ ] ;
593
572
arity = 0 ;
594
573
}
@@ -601,7 +580,12 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
601
580
// subfields.
602
581
// Note: `t` is `str`, not `&str`.
603
582
let ty = self . reveal_opaque_ty ( * t) ;
604
- let subpattern = DeconstructedPat :: new ( Str ( * value) , Vec :: new ( ) , 0 , ty, pat) ;
583
+ // FIXME: why does `Str` need a `mir::Value`?
584
+ let val = mir:: Const :: Ty (
585
+ * value_ty,
586
+ ty:: Const :: new_value ( self . tcx , * value, * value_ty) ,
587
+ ) ;
588
+ let subpattern = DeconstructedPat :: new ( Str ( val) , Vec :: new ( ) , 0 , ty, pat) ;
605
589
ctor = Ref ;
606
590
fields = vec ! [ subpattern. at_index( 0 ) ] ;
607
591
arity = 1 ;
0 commit comments