@@ -1369,9 +1369,28 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
1369
1369
fn assemble_candidates_for_unsizing ( & mut self ,
1370
1370
obligation : & TraitObligation < ' tcx > ,
1371
1371
candidates : & mut SelectionCandidateSet < ' tcx > ) {
1372
- // It is ok to skip past the higher-ranked binders here because the `match`
1373
- // below does not consider regions at all.
1374
- let source = self . infcx . shallow_resolve ( * obligation. self_ty ( ) . skip_binder ( ) ) ;
1372
+ // We currently never consider higher-ranked obligations e.g.
1373
+ // `for<'a> &'a T: Unsize<Trait+'a>` to be implemented. This is not
1374
+ // because they are a priori invalid, and we could potentially add support
1375
+ // for them later, it's just that there isn't really a strong need for it.
1376
+ // A `T: Unsize<U>` obligation is always used as part of a `T: CoerceUnsize<U>`
1377
+ // impl, and those are generally applied to concrete types.
1378
+ //
1379
+ // That said, one might try to write a fn with a where clause like
1380
+ // for<'a> Foo<'a, T>: Unsize<Foo<'a, Trait>>
1381
+ // where the `'a` is kind of orthogonal to the relevant part of the `Unsize`.
1382
+ // Still, you'd be more likely to write that where clause as
1383
+ // T: Trait
1384
+ // so it seems ok if we (conservatively) fail to accept that `Unsize`
1385
+ // obligation above. Should be possible to extend this in the future.
1386
+ let self_ty = match ty:: no_late_bound_regions ( self . tcx ( ) , & obligation. self_ty ( ) ) {
1387
+ Some ( t) => t,
1388
+ None => {
1389
+ // Don't add any candidates if there are bound regions.
1390
+ return ;
1391
+ }
1392
+ } ;
1393
+ let source = self . infcx . shallow_resolve ( self_ty) ;
1375
1394
let target = self . infcx . shallow_resolve ( obligation. predicate . 0 . input_types ( ) [ 0 ] ) ;
1376
1395
1377
1396
debug ! ( "assemble_candidates_for_unsizing(source={}, target={})" ,
@@ -2403,8 +2422,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
2403
2422
SelectionError < ' tcx > > {
2404
2423
let tcx = self . tcx ( ) ;
2405
2424
2406
- // TODO is this skip_binder Ok?
2407
- let source = self . infcx . shallow_resolve ( * obligation. self_ty ( ) . skip_binder ( ) ) ;
2425
+ // assemble_candidates_for_unsizing should ensure there are no late bound
2426
+ // regions here. See the comment there for more details.
2427
+ let source = self . infcx . shallow_resolve (
2428
+ ty:: no_late_bound_regions ( tcx, & obligation. self_ty ( ) ) . unwrap ( ) ) ;
2408
2429
let target = self . infcx . shallow_resolve ( obligation. predicate . 0 . input_types ( ) [ 0 ] ) ;
2409
2430
2410
2431
debug ! ( "confirm_builtin_unsize_candidate(source={}, target={})" ,
0 commit comments