@@ -396,6 +396,32 @@ where
396396
397397 generalizer. relate ( value, value)
398398 }
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+ }
399425}
400426
401427/// When we instantiate an inference variable with a value in
@@ -572,32 +598,12 @@ where
572598 ( & ty:: Infer ( ty:: TyVar ( vid) ) , _) => self . relate_ty_var ( ( vid, b) ) ,
573599
574600 ( & 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+ } )
576604 }
577605 ( & 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)
601607 }
602608
603609 ( & ty:: Projection ( projection_ty) , _)
0 commit comments