@@ -524,52 +524,7 @@ pub fn super_relate_consts<R: TypeRelation<'tcx>>(
524
524
( ty:: ConstKind :: Param ( a_p) , ty:: ConstKind :: Param ( b_p) ) => a_p. index == b_p. index ,
525
525
( ty:: ConstKind :: Placeholder ( p1) , ty:: ConstKind :: Placeholder ( p2) ) => p1 == p2,
526
526
( ty:: ConstKind :: Value ( a_val) , ty:: ConstKind :: Value ( b_val) ) => {
527
- match ( a_val, b_val) {
528
- (
529
- ConstValue :: Scalar ( Scalar :: Int ( a_val) ) ,
530
- ConstValue :: Scalar ( Scalar :: Int ( b_val) ) ,
531
- ) => a_val == b_val,
532
- (
533
- ConstValue :: Scalar ( Scalar :: Ptr ( a_val) ) ,
534
- ConstValue :: Scalar ( Scalar :: Ptr ( b_val) ) ,
535
- ) => {
536
- a_val == b_val
537
- || match (
538
- tcx. global_alloc ( a_val. alloc_id ) ,
539
- tcx. global_alloc ( b_val. alloc_id ) ,
540
- ) {
541
- (
542
- GlobalAlloc :: Function ( a_instance) ,
543
- GlobalAlloc :: Function ( b_instance) ,
544
- ) => a_instance == b_instance,
545
- _ => false ,
546
- }
547
- }
548
-
549
- ( ConstValue :: Slice { .. } , ConstValue :: Slice { .. } ) => {
550
- get_slice_bytes ( & tcx, a_val) == get_slice_bytes ( & tcx, b_val)
551
- }
552
-
553
- ( ConstValue :: ByRef { .. } , ConstValue :: ByRef { .. } ) => {
554
- let a_destructured = tcx. destructure_const ( relation. param_env ( ) . and ( a) ) ;
555
- let b_destructured = tcx. destructure_const ( relation. param_env ( ) . and ( b) ) ;
556
-
557
- // Both the variant and each field have to be equal.
558
- if a_destructured. variant == b_destructured. variant {
559
- for ( a_field, b_field) in
560
- a_destructured. fields . iter ( ) . zip ( b_destructured. fields . iter ( ) )
561
- {
562
- relation. consts ( a_field, b_field) ?;
563
- }
564
-
565
- true
566
- } else {
567
- false
568
- }
569
- }
570
-
571
- _ => false ,
572
- }
527
+ check_const_value_eq ( relation, a_val, b_val, a, b) ?
573
528
}
574
529
575
530
(
@@ -598,6 +553,56 @@ pub fn super_relate_consts<R: TypeRelation<'tcx>>(
598
553
if is_match { Ok ( a) } else { Err ( TypeError :: ConstMismatch ( expected_found ( relation, a, b) ) ) }
599
554
}
600
555
556
+ fn check_const_value_eq < R : TypeRelation < ' tcx > > (
557
+ relation : & mut R ,
558
+ a_val : ConstValue < ' tcx > ,
559
+ b_val : ConstValue < ' tcx > ,
560
+ // FIXME(oli-obk): these arguments should go away with valtrees
561
+ a : & ' tcx ty:: Const < ' tcx > ,
562
+ b : & ' tcx ty:: Const < ' tcx > ,
563
+ // FIXME(oli-obk): this should just be `bool` with valtrees
564
+ ) -> RelateResult < ' tcx , bool > {
565
+ let tcx = relation. tcx ( ) ;
566
+ Ok ( match ( a_val, b_val) {
567
+ ( ConstValue :: Scalar ( Scalar :: Int ( a_val) ) , ConstValue :: Scalar ( Scalar :: Int ( b_val) ) ) => {
568
+ a_val == b_val
569
+ }
570
+ ( ConstValue :: Scalar ( Scalar :: Ptr ( a_val) ) , ConstValue :: Scalar ( Scalar :: Ptr ( b_val) ) ) => {
571
+ a_val == b_val
572
+ || match ( tcx. global_alloc ( a_val. alloc_id ) , tcx. global_alloc ( b_val. alloc_id ) ) {
573
+ ( GlobalAlloc :: Function ( a_instance) , GlobalAlloc :: Function ( b_instance) ) => {
574
+ a_instance == b_instance
575
+ }
576
+ _ => false ,
577
+ }
578
+ }
579
+
580
+ ( ConstValue :: Slice { .. } , ConstValue :: Slice { .. } ) => {
581
+ get_slice_bytes ( & tcx, a_val) == get_slice_bytes ( & tcx, b_val)
582
+ }
583
+
584
+ ( ConstValue :: ByRef { .. } , ConstValue :: ByRef { .. } ) => {
585
+ let a_destructured = tcx. destructure_const ( relation. param_env ( ) . and ( a) ) ;
586
+ let b_destructured = tcx. destructure_const ( relation. param_env ( ) . and ( b) ) ;
587
+
588
+ // Both the variant and each field have to be equal.
589
+ if a_destructured. variant == b_destructured. variant {
590
+ for ( a_field, b_field) in
591
+ a_destructured. fields . iter ( ) . zip ( b_destructured. fields . iter ( ) )
592
+ {
593
+ relation. consts ( a_field, b_field) ?;
594
+ }
595
+
596
+ true
597
+ } else {
598
+ false
599
+ }
600
+ }
601
+
602
+ _ => false ,
603
+ } )
604
+ }
605
+
601
606
impl < ' tcx > Relate < ' tcx > for & ' tcx ty:: List < ty:: Binder < ty:: ExistentialPredicate < ' tcx > > > {
602
607
fn relate < R : TypeRelation < ' tcx > > (
603
608
relation : & mut R ,
0 commit comments