@@ -140,7 +140,7 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>(
140140 item : Option < & hir:: Item < ' tcx > > ,
141141 cause : & mut traits:: ObligationCause < ' tcx > ,
142142 pred : & ty:: Predicate < ' _ > ,
143- mut trait_assoc_items : impl Iterator < Item = ty:: AssocItem > ,
143+ mut trait_assoc_items : impl Iterator < Item = & ' tcx ty:: AssocItem > ,
144144) {
145145 debug ! (
146146 "extended_cause_with_original_assoc_item_obligation {:?} {:?} {:?} {:?}" ,
@@ -232,35 +232,34 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
232232
233233 let item = self . item ;
234234
235+ let extend = |obligation : traits:: PredicateObligation < ' tcx > | {
236+ let mut cause = cause. clone ( ) ;
237+ if let Some ( parent_trait_ref) = obligation. predicate . to_opt_poly_trait_ref ( ) {
238+ let derived_cause = traits:: DerivedObligationCause {
239+ parent_trait_ref,
240+ parent_code : Rc :: new ( obligation. cause . code . clone ( ) ) ,
241+ } ;
242+ cause. code = traits:: ObligationCauseCode :: DerivedObligation ( derived_cause) ;
243+ }
244+ extend_cause_with_original_assoc_item_obligation (
245+ tcx,
246+ trait_ref,
247+ item,
248+ & mut cause,
249+ & obligation. predicate ,
250+ tcx. associated_items ( trait_ref. def_id ) . in_definition_order ( ) ,
251+ ) ;
252+ traits:: Obligation :: new ( cause, param_env, obligation. predicate )
253+ } ;
254+
235255 if let Elaborate :: All = elaborate {
236- let implied_obligations = traits:: util:: elaborate_obligations ( tcx, obligations. clone ( ) ) ;
237- let implied_obligations = implied_obligations. map ( |obligation| {
238- debug ! ( "compute_trait_ref implied_obligation {:?}" , obligation) ;
239- debug ! ( "compute_trait_ref implied_obligation cause {:?}" , obligation. cause) ;
240- let mut cause = cause. clone ( ) ;
241- if let Some ( parent_trait_ref) = obligation. predicate . to_opt_poly_trait_ref ( ) {
242- let derived_cause = traits:: DerivedObligationCause {
243- parent_trait_ref,
244- parent_code : Rc :: new ( obligation. cause . code . clone ( ) ) ,
245- } ;
246- cause. code = traits:: ObligationCauseCode :: DerivedObligation ( derived_cause) ;
247- }
248- extend_cause_with_original_assoc_item_obligation (
249- tcx,
250- trait_ref,
251- item,
252- & mut cause,
253- & obligation. predicate ,
254- tcx. associated_items ( trait_ref. def_id ) . in_definition_order ( ) . copied ( ) ,
255- ) ;
256- debug ! ( "compute_trait_ref new cause {:?}" , cause) ;
257- traits:: Obligation :: new ( cause, param_env, obligation. predicate )
258- } ) ;
256+ let implied_obligations = traits:: util:: elaborate_obligations ( tcx, obligations) ;
257+ let implied_obligations = implied_obligations. map ( extend) ;
259258 self . out . extend ( implied_obligations) ;
259+ } else {
260+ self . out . extend ( obligations) ;
260261 }
261262
262- self . out . extend ( obligations) ;
263-
264263 self . out . extend ( trait_ref. substs . types ( ) . filter ( |ty| !ty. has_escaping_bound_vars ( ) ) . map (
265264 |ty| traits:: Obligation :: new ( cause. clone ( ) , param_env, ty:: Predicate :: WellFormed ( ty) ) ,
266265 ) ) ;
0 commit comments