@@ -22,8 +22,7 @@ use super::elaborate_predicates;
22
22
use hir:: def_id:: DefId ;
23
23
use lint;
24
24
use traits:: { self , Obligation , ObligationCause } ;
25
- use ty:: { self , Ty , TyCtxt , Binder , TypeFoldable , Predicate , ToPredicate } ;
26
- use ty:: subst:: { Subst } ;
25
+ use ty:: { self , Ty , TyCtxt , TypeFoldable , Predicate , ToPredicate } ;
27
26
use std:: borrow:: Cow ;
28
27
use std:: iter:: { self } ;
29
28
use syntax:: ast:: { self , Name } ;
@@ -313,14 +312,17 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
313
312
return Some ( MethodViolationCode :: WhereClauseReferencesSelf ( span) ) ;
314
313
}
315
314
316
- let receiver_ty = sig. map_bound ( |sig| sig. inputs ( ) [ 0 ] ) ;
315
+ let receiver_ty = self . liberate_late_bound_regions (
316
+ method. def_id ,
317
+ & sig. map_bound ( |sig| sig. inputs ( ) [ 0 ] ) ,
318
+ ) ;
317
319
318
320
// until we get by-value DST, `self: Self` can't be coerced
319
321
// but we allow this as a special case.
320
322
// maybe instead we should also check for
321
323
// for (U) { if (Self: Unsize<U>) { Receiver: Unsize<Receiver<Self=Self>>}}
322
- if * receiver_ty. skip_binder ( ) != self . mk_self_type ( ) {
323
- if !self . receiver_is_coercible ( method, receiver_ty) {
324
+ if receiver_ty != self . mk_self_type ( ) {
325
+ if !self . receiver_is_coercible ( trait_def_id , method, receiver_ty) {
324
326
return Some ( MethodViolationCode :: UncoercibleReceiver ) ;
325
327
}
326
328
}
@@ -339,7 +341,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
339
341
fn receiver_is_coercible (
340
342
self ,
341
343
method : & ty:: AssociatedItem ,
342
- receiver_ty : Binder < Ty < ' tcx > > ,
344
+ receiver_ty : Ty < ' tcx > ,
343
345
) -> bool
344
346
{
345
347
debug ! ( "receiver_is_coercible: method = {:?}, receiver_ty = {:?}" , method, receiver_ty) ;
@@ -389,12 +391,10 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
389
391
390
392
// Receiver: CoerceUnsized<Receiver<Self=U>>
391
393
let obligation = {
392
- let predicate = receiver_ty. fuse ( target_receiver_ty, |receiver_ty, target_receiver_ty| {
393
- ty:: TraitRef {
394
- def_id : coerce_unsized_did,
395
- substs : self . mk_substs_trait ( receiver_ty, & [ target_receiver_ty. into ( ) ] ) ,
396
- }
397
- } ) . to_predicate ( ) ;
394
+ let predicate = ty:: TraitRef {
395
+ def_id : coerce_unsized_did,
396
+ substs : self . mk_substs_trait ( receiver_ty, & [ target_receiver_ty. into ( ) ] ) ,
397
+ } . to_predicate ( ) ;
398
398
399
399
Obligation :: new (
400
400
ObligationCause :: dummy ( ) ,
0 commit comments