@@ -3,6 +3,7 @@ use std::marker::PhantomData;
33use  rustc_data_structures:: obligation_forest:: { 
44    Error ,  ForestObligation ,  ObligationForest ,  ObligationProcessor ,  Outcome ,  ProcessResult , 
55} ; 
6+ use  rustc_hir:: def_id:: LocalDefId ; 
67use  rustc_infer:: infer:: DefineOpaqueTypes ; 
78use  rustc_infer:: traits:: { 
89    FromSolverError ,  PolyTraitObligation ,  PredicateObligations ,  ProjectionCacheKey ,  SelectionError , 
@@ -12,8 +13,9 @@ use rustc_middle::bug;
1213use  rustc_middle:: ty:: abstract_const:: NotConstEvaluatable ; 
1314use  rustc_middle:: ty:: error:: { ExpectedFound ,  TypeError } ; 
1415use  rustc_middle:: ty:: { 
15-     self ,  Binder ,  Const ,  GenericArgsRef ,  TypeVisitableExt ,   TypingMode ,  may_use_unstable_feature , 
16+     self ,  Binder ,  Const ,  GenericArgsRef ,  TypeVisitable ,   TypeVisitableExt ,   TypingMode , 
1617} ; 
18+ use  rustc_span:: DUMMY_SP ; 
1719use  thin_vec:: { ThinVec ,  thin_vec} ; 
1820use  tracing:: { debug,  debug_span,  instrument} ; 
1921
@@ -26,6 +28,7 @@ use super::{
2628} ; 
2729use  crate :: error_reporting:: InferCtxtErrorExt ; 
2830use  crate :: infer:: { InferCtxt ,  TyOrConstInferVar } ; 
31+ use  crate :: solve:: StalledOnCoroutines ; 
2932use  crate :: traits:: normalize:: normalize_with_depth_to; 
3033use  crate :: traits:: project:: { PolyProjectionObligation ,  ProjectionCacheKeyExt  as  _} ; 
3134use  crate :: traits:: query:: evaluate_obligation:: InferCtxtExt ; 
@@ -168,15 +171,33 @@ where
168171        & mut  self , 
169172        infcx :  & InferCtxt < ' tcx > , 
170173    )  -> PredicateObligations < ' tcx >  { 
171-         let  mut  processor =
172-             DrainProcessor  {  removed_predicates :  PredicateObligations :: new ( ) ,  infcx } ; 
174+         let  stalled_coroutines = match  infcx. typing_mode ( )  { 
175+             TypingMode :: Analysis  {  defining_opaque_types_and_generators }  => { 
176+                 defining_opaque_types_and_generators
177+             } 
178+             TypingMode :: Coherence 
179+             | TypingMode :: Borrowck  {  defining_opaque_types :  _ } 
180+             | TypingMode :: PostBorrowckAnalysis  {  defined_opaque_types :  _ } 
181+             | TypingMode :: PostAnalysis  => return  Default :: default ( ) , 
182+         } ; 
183+ 
184+         if  stalled_coroutines. is_empty ( )  { 
185+             return  Default :: default ( ) ; 
186+         } 
187+ 
188+         let  mut  processor = DrainProcessor  { 
189+             infcx, 
190+             removed_predicates :  PredicateObligations :: new ( ) , 
191+             stalled_coroutines, 
192+         } ; 
173193        let  outcome:  Outcome < _ ,  _ >  = self . predicates . process_obligations ( & mut  processor) ; 
174194        assert ! ( outcome. errors. is_empty( ) ) ; 
175195        return  processor. removed_predicates ; 
176196
177197        struct  DrainProcessor < ' a ,  ' tcx >  { 
178198            infcx :  & ' a  InferCtxt < ' tcx > , 
179199            removed_predicates :  PredicateObligations < ' tcx > , 
200+             stalled_coroutines :  & ' tcx  ty:: List < LocalDefId > , 
180201        } 
181202
182203        impl < ' tcx >  ObligationProcessor  for  DrainProcessor < ' _ ,  ' tcx >  { 
@@ -185,10 +206,14 @@ where
185206            type  OUT  = Outcome < Self :: Obligation ,  Self :: Error > ; 
186207
187208            fn  needs_process_obligation ( & self ,  pending_obligation :  & Self :: Obligation )  -> bool  { 
188-                 pending_obligation
189-                     . stalled_on 
190-                     . iter ( ) 
191-                     . any ( |& var| self . infcx . ty_or_const_infer_var_changed ( var) ) 
209+                 self . infcx 
210+                     . resolve_vars_if_possible ( pending_obligation. obligation . predicate ) 
211+                     . visit_with ( & mut  StalledOnCoroutines  { 
212+                         stalled_coroutines :  self . stalled_coroutines , 
213+                         span :  DUMMY_SP , 
214+                         cache :  Default :: default ( ) , 
215+                     } ) 
216+                     . is_break ( ) 
192217            } 
193218
194219            fn  process_obligation ( 
0 commit comments