@@ -81,9 +81,8 @@ impl<'t, I: Interner> Unifier<'t, I> {
8181 } )
8282 }
8383
84- fn unify_ty_ty < ' a > ( & mut self , a : & ' a Ty < I > , b : & ' a Ty < I > ) -> Fallible < ( ) > {
84+ fn unify_ty_ty ( & mut self , a : & Ty < I > , b : & Ty < I > ) -> Fallible < ( ) > {
8585 let interner = self . interner ;
86- // ^^ ^^ ^^ FIXME rustc bug
8786
8887 let n_a = self . table . normalize_ty_shallow ( interner, a) ;
8988 let n_b = self . table . normalize_ty_shallow ( interner, b) ;
@@ -343,28 +342,12 @@ impl<'t, I: Interner> Unifier<'t, I> {
343342 Ok ( ( ) )
344343 }
345344
346- ( & LifetimeData :: InferenceVar ( var) , & LifetimeData :: Placeholder ( idx) )
347- | ( & LifetimeData :: Placeholder ( idx) , & LifetimeData :: InferenceVar ( var) ) => {
348- let var = EnaVariable :: from ( var) ;
349- let var_ui = self . table . universe_of_unbound_var ( var) ;
350- if var_ui. can_see ( idx. ui ) {
351- debug ! (
352- "unify_lifetime_lifetime: {:?} in {:?} can see {:?}; unifying" ,
353- var, var_ui, idx. ui
354- ) ;
355- let v = LifetimeData :: Placeholder ( idx) . intern ( interner) ;
356- self . table
357- . unify
358- . unify_var_value ( var, InferenceValue :: from_lifetime ( interner, v) )
359- . unwrap ( ) ;
360- Ok ( ( ) )
361- } else {
362- debug ! (
363- "unify_lifetime_lifetime: {:?} in {:?} cannot see {:?}; pushing constraint" ,
364- var, var_ui, idx. ui
365- ) ;
366- Ok ( self . push_lifetime_eq_constraint ( a. clone ( ) , b. clone ( ) ) )
367- }
345+ ( & LifetimeData :: InferenceVar ( a_var) , & LifetimeData :: Placeholder ( b_idx) ) => {
346+ self . unify_lifetime_var ( a, b, a_var, b, b_idx. ui )
347+ }
348+
349+ ( & LifetimeData :: Placeholder ( a_idx) , & LifetimeData :: InferenceVar ( b_var) ) => {
350+ self . unify_lifetime_var ( a, b, b_var, a, a_idx. ui )
368351 }
369352
370353 ( & LifetimeData :: Placeholder ( _) , & LifetimeData :: Placeholder ( _) ) => {
@@ -384,6 +367,44 @@ impl<'t, I: Interner> Unifier<'t, I> {
384367 }
385368 }
386369
370+ fn unify_lifetime_var (
371+ & mut self ,
372+ a : & Lifetime < I > ,
373+ b : & Lifetime < I > ,
374+ var : InferenceVar ,
375+ value : & Lifetime < I > ,
376+ value_ui : UniverseIndex ,
377+ ) -> Fallible < ( ) > {
378+ debug_heading ! (
379+ "unify_lifetime_var(var={:?}, value={:?}, value_ui={:?})" ,
380+ var,
381+ value,
382+ value_ui
383+ ) ;
384+ let var = EnaVariable :: from ( var) ;
385+ let var_ui = self . table . universe_of_unbound_var ( var) ;
386+ if var_ui. can_see ( value_ui) {
387+ debug ! (
388+ "unify_lifetime_var: {:?} in {:?} can see {:?}; unifying" ,
389+ var, var_ui, value_ui
390+ ) ;
391+ self . table
392+ . unify
393+ . unify_var_value (
394+ var,
395+ InferenceValue :: from_lifetime ( & self . interner , value. clone ( ) ) ,
396+ )
397+ . unwrap ( ) ;
398+ Ok ( ( ) )
399+ } else {
400+ debug ! (
401+ "unify_lifetime_var: {:?} in {:?} cannot see {:?}; pushing constraint" ,
402+ var, var_ui, value_ui
403+ ) ;
404+ Ok ( self . push_lifetime_eq_constraint ( a. clone ( ) , b. clone ( ) ) )
405+ }
406+ }
407+
387408 fn unify_const_const < ' a > ( & mut self , a : & ' a Const < I > , b : & ' a Const < I > ) -> Fallible < ( ) > {
388409 let interner = self . interner ;
389410
0 commit comments