@@ -174,6 +174,8 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
174
174
// Include projections defined on supertraits.
175
175
projection_bounds. push ( ( pred, span) ) ;
176
176
}
177
+
178
+ self . check_elaborated_projection_mentions_input_lifetimes ( pred, span) ;
177
179
}
178
180
_ => ( ) ,
179
181
}
@@ -360,6 +362,54 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
360
362
361
363
Ty :: new_dynamic ( tcx, existential_predicates, region_bound, representation)
362
364
}
365
+
366
+ /// Check that elaborating the principal of a trait ref doesn't lead to projections
367
+ /// that are unconstrained. This can happen because an otherwise unconstrained
368
+ /// *type variable* can be substituted with a type that has late-bound regions. See
369
+ /// `elaborated-predicates-unconstrained-late-bound.rs` for a test.
370
+ fn check_elaborated_projection_mentions_input_lifetimes (
371
+ & self ,
372
+ pred : ty:: PolyProjectionPredicate < ' tcx > ,
373
+ span : Span ,
374
+ ) {
375
+ let tcx = self . tcx ( ) ;
376
+
377
+ // Find any late-bound regions declared in `ty` that are not
378
+ // declared in the trait-ref or assoc_item. These are not well-formed.
379
+ //
380
+ // Example:
381
+ //
382
+ // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
383
+ // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
384
+ let late_bound_in_projection_term =
385
+ tcx. collect_constrained_late_bound_regions ( pred. map_bound ( |pred| pred. projection_term ) ) ;
386
+ let late_bound_in_term =
387
+ tcx. collect_referenced_late_bound_regions ( pred. map_bound ( |pred| pred. term ) ) ;
388
+ debug ! ( ?late_bound_in_projection_term) ;
389
+ debug ! ( ?late_bound_in_term) ;
390
+
391
+ // FIXME: point at the type params that don't have appropriate lifetimes:
392
+ // struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
393
+ // ---- ---- ^^^^^^^
394
+ // NOTE(associated_const_equality): This error should be impossible to trigger
395
+ // with associated const equality constraints.
396
+ self . validate_late_bound_regions (
397
+ late_bound_in_projection_term,
398
+ late_bound_in_term,
399
+ |br_name| {
400
+ let item_name = tcx. item_name ( pred. projection_def_id ( ) ) ;
401
+ struct_span_code_err ! (
402
+ self . dcx( ) ,
403
+ span,
404
+ E0582 ,
405
+ "binding for associated type `{}` references {}, \
406
+ which does not appear in the trait input types",
407
+ item_name,
408
+ br_name
409
+ )
410
+ } ,
411
+ ) ;
412
+ }
363
413
}
364
414
365
415
fn replace_dummy_self_with_error < ' tcx , T : TypeFoldable < TyCtxt < ' tcx > > > (
0 commit comments