@@ -517,78 +517,57 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
517517 ) ,
518518 }
519519 }
520- PatKind :: Constant { value } => {
520+ PatKind :: Constant { ty : value_ty , value } => {
521521 match ty. kind ( ) {
522522 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 ( ) ) ;
527524 fields = vec ! [ ] ;
528525 arity = 0 ;
529526 }
530527 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) )
543538 } ;
544539 fields = vec ! [ ] ;
545540 arity = 0 ;
546541 }
547542 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 ) ;
556547 fields = vec ! [ ] ;
557548 arity = 0 ;
558549 }
559550 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 ) ;
568555 fields = vec ! [ ] ;
569556 arity = 0 ;
570557 }
571558 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 ) ;
580563 fields = vec ! [ ] ;
581564 arity = 0 ;
582565 }
583566 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 ) ;
592571 fields = vec ! [ ] ;
593572 arity = 0 ;
594573 }
@@ -601,7 +580,12 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
601580 // subfields.
602581 // Note: `t` is `str`, not `&str`.
603582 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) ;
605589 ctor = Ref ;
606590 fields = vec ! [ subpattern. at_index( 0 ) ] ;
607591 arity = 1 ;
0 commit comments