@@ -170,55 +170,67 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
170170 let cause = self . cause ( traits:: MiscObligation ) ;
171171 let param_env = self . param_env ;
172172
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+ ) ;
197192 }
198193 }
199- ty:: Predicate :: Trait ( proj) => {
194+ }
195+ ty:: Predicate :: Trait ( proj) => {
200196 if let (
201197 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
205201 . filter( |i| i. def_id == * item_def_id)
206202 . 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) ) )
211207 {
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+ ) ;
218213 }
219214 }
220- _ => { }
221215 }
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+ ) ;
222234 traits : : Obligation :: new( cause, param_env, pred)
223235 } ) ;
224236 self . out. extend( implied_obligations) ;
0 commit comments