@@ -396,6 +396,32 @@ where
396
396
397
397
generalizer. relate ( value, value)
398
398
}
399
+
400
+ fn relate_opaques ( & mut self , a : Ty < ' tcx > , b : Ty < ' tcx > ) -> RelateResult < ' tcx , Ty < ' tcx > > {
401
+ let ( a, b) = if self . a_is_expected ( ) { ( a, b) } else { ( b, a) } ;
402
+ let mut generalize = |ty, ty_is_expected| {
403
+ let var = self . infcx . next_ty_var_id_in_universe (
404
+ TypeVariableOrigin {
405
+ kind : TypeVariableOriginKind :: MiscVariable ,
406
+ span : self . delegate . span ( ) ,
407
+ } ,
408
+ ty:: UniverseIndex :: ROOT ,
409
+ ) ;
410
+ if ty_is_expected {
411
+ self . relate_ty_var ( ( ty, var) )
412
+ } else {
413
+ self . relate_ty_var ( ( var, ty) )
414
+ }
415
+ } ;
416
+ let ( a, b) = match ( a. kind ( ) , b. kind ( ) ) {
417
+ ( & ty:: Opaque ( ..) , _) => ( a, generalize ( b, false ) ?) ,
418
+ ( _, & ty:: Opaque ( ..) ) => ( generalize ( a, true ) ?, b) ,
419
+ _ => unreachable ! ( ) ,
420
+ } ;
421
+ self . delegate . register_opaque_type ( a, b, true ) ?;
422
+ trace ! ( a = ?a. kind( ) , b = ?b. kind( ) , "opaque type instantiated" ) ;
423
+ Ok ( a)
424
+ }
399
425
}
400
426
401
427
/// When we instantiate an inference variable with a value in
@@ -572,32 +598,12 @@ where
572
598
( & ty:: Infer ( ty:: TyVar ( vid) ) , _) => self . relate_ty_var ( ( vid, b) ) ,
573
599
574
600
( & ty:: Opaque ( a_def_id, _) , & ty:: Opaque ( b_def_id, _) ) if a_def_id == b_def_id => {
575
- self . infcx . super_combine_tys ( self , a, b)
601
+ infcx. commit_if_ok ( |_| infcx. super_combine_tys ( self , a, b) ) . or_else ( |err| {
602
+ if a_def_id. is_local ( ) { self . relate_opaques ( a, b) } else { Err ( err) }
603
+ } )
576
604
}
577
605
( & ty:: Opaque ( did, ..) , _) | ( _, & ty:: Opaque ( did, ..) ) if did. is_local ( ) => {
578
- let ( a, b) = if self . a_is_expected ( ) { ( a, b) } else { ( b, a) } ;
579
- let mut generalize = |ty, ty_is_expected| {
580
- let var = infcx. next_ty_var_id_in_universe (
581
- TypeVariableOrigin {
582
- kind : TypeVariableOriginKind :: MiscVariable ,
583
- span : self . delegate . span ( ) ,
584
- } ,
585
- ty:: UniverseIndex :: ROOT ,
586
- ) ;
587
- if ty_is_expected {
588
- self . relate_ty_var ( ( ty, var) )
589
- } else {
590
- self . relate_ty_var ( ( var, ty) )
591
- }
592
- } ;
593
- let ( a, b) = match ( a. kind ( ) , b. kind ( ) ) {
594
- ( & ty:: Opaque ( ..) , _) => ( a, generalize ( b, false ) ?) ,
595
- ( _, & ty:: Opaque ( ..) ) => ( generalize ( a, true ) ?, b) ,
596
- _ => unreachable ! ( ) ,
597
- } ;
598
- self . delegate . register_opaque_type ( a, b, true ) ?;
599
- trace ! ( a = ?a. kind( ) , b = ?b. kind( ) , "opaque type instantiated" ) ;
600
- Ok ( a)
606
+ self . relate_opaques ( a, b)
601
607
}
602
608
603
609
( & ty:: Projection ( projection_ty) , _)
0 commit comments