@@ -140,7 +140,7 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>(
140
140
item : Option < & hir:: Item < ' tcx > > ,
141
141
cause : & mut traits:: ObligationCause < ' tcx > ,
142
142
pred : & ty:: Predicate < ' _ > ,
143
- mut trait_assoc_items : impl Iterator < Item = ty:: AssocItem > ,
143
+ mut trait_assoc_items : impl Iterator < Item = & ' tcx ty:: AssocItem > ,
144
144
) {
145
145
debug ! (
146
146
"extended_cause_with_original_assoc_item_obligation {:?} {:?} {:?} {:?}" ,
@@ -232,35 +232,34 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
232
232
233
233
let item = self . item ;
234
234
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
+
235
255
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) ;
259
258
self . out . extend ( implied_obligations) ;
259
+ } else {
260
+ self . out . extend ( obligations) ;
260
261
}
261
262
262
- self . out . extend ( obligations) ;
263
-
264
263
self . out . extend ( trait_ref. substs . types ( ) . filter ( |ty| !ty. has_escaping_bound_vars ( ) ) . map (
265
264
|ty| traits:: Obligation :: new ( cause. clone ( ) , param_env, ty:: Predicate :: WellFormed ( ty) ) ,
266
265
) ) ;
0 commit comments