@@ -170,55 +170,67 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
170
170
let cause = self . cause ( traits:: MiscObligation ) ;
171
171
let param_env = self . param_env ;
172
172
173
- if let Elaborate :: All = elaborate {
174
- let trait_assoc_items = tcx. associated_items ( trait_ref. def_id ) ;
175
-
176
- let predicates = obligations. iter ( )
177
- . map ( |obligation| obligation. predicate . clone ( ) )
178
- . collect ( ) ;
179
- let implied_obligations = traits:: elaborate_predicates ( tcx, predicates) ;
180
- let item_span: Option < Span > = self . item . map ( |i| i. span ) ;
181
- let item = & self . item ;
182
- let implied_obligations = implied_obligations. map ( |pred| {
183
- let mut cause = cause. clone ( ) ;
184
- match & pred {
185
- ty:: Predicate :: Projection ( proj) => {
186
- if let Some ( hir:: ItemKind :: Impl ( .., impl_items) ) = item. map ( |i| & i. kind ) {
187
- let trait_assoc_item = tcx. associated_item ( proj. projection_def_id ( ) ) ;
188
- if let Some ( impl_item) = impl_items. iter ( ) . filter ( |item| {
189
- item. ident == trait_assoc_item. ident
190
- } ) . next ( ) {
191
- cause. span = impl_item. span ;
192
- cause. code = traits:: AssocTypeBound (
193
- item_span,
194
- trait_assoc_item. ident . span ,
195
- ) ;
196
- }
173
+ let item = & self . item ;
174
+ let extend_cause_with_original_assoc_item_obligation = |
175
+ cause : & mut traits:: ObligationCause < ' _ > ,
176
+ pred : & ty:: Predicate < ' _ > ,
177
+ trait_assoc_items : ty:: AssocItemsIterator < ' _ > ,
178
+ | {
179
+ let item_span = item. map( |i| tcx. sess. source_map( ) . def_span( i. span) ) ;
180
+ match pred {
181
+ ty : : Predicate :: Projection ( proj) => {
182
+ if let Some ( hir:: ItemKind :: Impl ( .., impl_items) ) = item. map( |i| & i. kind) {
183
+ let trait_assoc_item = tcx. associated_item( proj. projection_def_id( ) ) ;
184
+ if let Some ( impl_item) = impl_items. iter( ) . filter( |item| {
185
+ item. ident == trait_assoc_item. ident
186
+ } ) . next( ) {
187
+ cause. span = impl_item. span;
188
+ cause. code = traits:: AssocTypeBound (
189
+ item_span,
190
+ trait_assoc_item. ident. span,
191
+ ) ;
197
192
}
198
193
}
199
- ty:: Predicate :: Trait ( proj) => {
194
+ }
195
+ ty:: Predicate :: Trait ( proj) => {
200
196
if let (
201
197
ty:: Projection ( ty:: ProjectionTy { item_def_id, .. } ) ,
202
- Some ( hir:: ItemKind :: Impl ( .., impl_items) ) ,
203
- ) = ( & proj. skip_binder ( ) . self_ty ( ) . kind , item. map ( |i| & i. kind ) ) {
204
- if let Some ( ( impl_item, trait_assoc_item) ) = trait_assoc_items. clone ( )
198
+ Some ( hir:: ItemKind :: Impl ( .., impl_items) ) ,
199
+ ) = ( & proj. skip_binder( ) . self_ty( ) . kind, item. map( |i| & i. kind) ) {
200
+ if let Some ( ( impl_item, trait_assoc_item) ) = trait_assoc_items
205
201
. filter( |i| i. def_id == * item_def_id)
206
202
. next( )
207
- . and_then ( |trait_assoc_item| impl_items. iter ( )
208
- . filter ( |i| i. ident == trait_assoc_item. ident )
209
- . next ( )
210
- . map ( |impl_item| ( impl_item, trait_assoc_item) ) )
203
+ . and_then( |trait_assoc_item| impl_items. iter( )
204
+ . filter( |i| i. ident == trait_assoc_item. ident )
205
+ . next( )
206
+ . map( |impl_item| ( impl_item, trait_assoc_item) ) )
211
207
{
212
- cause. span = impl_item. span ;
213
- cause. code = traits:: AssocTypeBound (
214
- item_span,
215
- trait_assoc_item. ident . span ,
216
- ) ;
217
- }
208
+ cause. span = impl_item. span;
209
+ cause. code = traits:: AssocTypeBound (
210
+ item_span,
211
+ trait_assoc_item. ident. span,
212
+ ) ;
218
213
}
219
214
}
220
- _ => { }
221
215
}
216
+ _ => { }
217
+ }
218
+ } ;
219
+
220
+ if let Elaborate :: All = elaborate {
221
+ let trait_assoc_items = tcx. associated_items( trait_ref. def_id) ;
222
+
223
+ let predicates = obligations. iter( )
224
+ . map( |obligation| obligation. predicate. clone( ) )
225
+ . collect( ) ;
226
+ let implied_obligations = traits:: elaborate_predicates( tcx, predicates) ;
227
+ let implied_obligations = implied_obligations. map( |pred| {
228
+ let mut cause = cause. clone( ) ;
229
+ extend_cause_with_original_assoc_item_obligation(
230
+ & mut cause,
231
+ & pred,
232
+ trait_assoc_items. clone( ) ,
233
+ ) ;
222
234
traits : : Obligation :: new( cause, param_env, pred)
223
235
} ) ;
224
236
self . out. extend( implied_obligations) ;
0 commit comments