@@ -252,6 +252,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
252252 method : & ty:: AssociatedItem )
253253 -> Option < MethodViolationCode >
254254 {
255+ debug ! ( "object_safety_violation_for_method({:?}, {:?})" , trait_def_id, method) ;
255256 // Any method that has a `Self : Sized` requisite is otherwise
256257 // exempt from the regulations.
257258 if self . generics_require_sized_self ( method. def_id ) {
@@ -270,6 +271,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
270271 method : & ty:: AssociatedItem )
271272 -> bool
272273 {
274+ debug ! ( "is_vtable_safe_method({:?}, {:?})" , trait_def_id, method) ;
273275 // Any method that has a `Self : Sized` requisite can't be called.
274276 if self . generics_require_sized_self ( method. def_id ) {
275277 return false ;
@@ -389,6 +391,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
389391 fn receiver_for_self_ty (
390392 self , receiver_ty : Ty < ' tcx > , self_ty : Ty < ' tcx > , method_def_id : DefId
391393 ) -> Ty < ' tcx > {
394+ debug ! ( "receiver_for_self_ty({:?}, {:?}, {:?})" , receiver_ty, self_ty, method_def_id) ;
392395 let substs = Substs :: for_item ( self , method_def_id, |param, _| {
393396 if param. index == 0 {
394397 self_ty. into ( )
@@ -397,7 +400,10 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
397400 }
398401 } ) ;
399402
400- receiver_ty. subst ( self , substs)
403+ let result = receiver_ty. subst ( self , substs) ;
404+ debug ! ( "receiver_for_self_ty({:?}, {:?}, {:?}) = {:?}" ,
405+ receiver_ty, self_ty, method_def_id, result) ;
406+ result
401407 }
402408
403409 /// creates the object type for the current trait. For example,
@@ -413,18 +419,26 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
413419 ) ;
414420
415421 let mut associated_types = traits:: supertraits ( self , ty:: Binder :: dummy ( trait_ref) )
416- . flat_map ( |trait_ref| self . associated_items ( trait_ref. def_id ( ) ) )
417- . filter ( |item| item. kind == ty:: AssociatedKind :: Type )
422+ . flat_map ( |super_trait_ref| {
423+ self . associated_items ( super_trait_ref. def_id ( ) )
424+ . map ( move |item| ( super_trait_ref, item) )
425+ } )
426+ . filter ( |( _, item) | item. kind == ty:: AssociatedKind :: Type )
418427 . collect :: < Vec < _ > > ( ) ;
419428
420429 // existential predicates need to be in a specific order
421- associated_types. sort_by_cached_key ( |item| self . def_path_hash ( item. def_id ) ) ;
422-
423- let projection_predicates = associated_types. into_iter ( ) . map ( |item| {
430+ associated_types. sort_by_cached_key ( |( _, item) | self . def_path_hash ( item. def_id ) ) ;
431+
432+ let projection_predicates = associated_types. into_iter ( ) . map ( |( super_trait_ref, item) | {
433+ // We *can* get bound lifetimes here in cases like
434+ // `trait MyTrait: for<'s> OtherTrait<&'s T, Output=bool>`.
435+ //
436+ // binder moved to (*)...
437+ let super_trait_ref = super_trait_ref. skip_binder ( ) ;
424438 ty:: ExistentialPredicate :: Projection ( ty:: ExistentialProjection {
425- ty : self . mk_projection ( item. def_id , trait_ref . substs ) ,
439+ ty : self . mk_projection ( item. def_id , super_trait_ref . substs ) ,
426440 item_def_id : item. def_id ,
427- substs : trait_ref . substs ,
441+ substs : super_trait_ref . substs ,
428442 } )
429443 } ) ;
430444
@@ -433,7 +447,8 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
433447 ) ;
434448
435449 let object_ty = self . mk_dynamic (
436- ty:: Binder :: dummy ( existential_predicates) ,
450+ // (*) ... binder re-introduced here
451+ ty:: Binder :: bind ( existential_predicates) ,
437452 lifetime,
438453 ) ;
439454
0 commit comments