@@ -415,7 +415,9 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
415
415
let bound_vars = tcx. late_bound_vars ( binding. hir_id ) ;
416
416
ty:: Binder :: bind_with_vars ( subst_output, bound_vars)
417
417
} else {
418
- // Append the generic arguments of the associated type to the `trait_ref`.
418
+ // Create the generic arguments for the associated type or constant by joining the
419
+ // parent arguments (the arguments of the trait) and the own arguments (the ones of
420
+ // the associated item itself) and construct an alias type using them.
419
421
candidate. map_bound ( |trait_ref| {
420
422
let ident = Ident :: new ( assoc_item. name , binding. item_name . span ) ;
421
423
let item_segment = hir:: PathSegment {
@@ -426,19 +428,22 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
426
428
infer_args : false ,
427
429
} ;
428
430
429
- let args_trait_ref_and_assoc_item = self . create_args_for_associated_item (
431
+ let alias_args = self . create_args_for_associated_item (
430
432
path_span,
431
433
assoc_item. def_id ,
432
434
& item_segment,
433
435
trait_ref. args ,
434
436
) ;
437
+ debug ! ( ?alias_args) ;
435
438
436
- debug ! ( ?args_trait_ref_and_assoc_item) ;
437
-
438
- ty:: AliasTy :: new ( tcx, assoc_item. def_id , args_trait_ref_and_assoc_item)
439
+ // Note that we're indeed also using `AliasTy` (alias *type*) for associated
440
+ // *constants* to represent *const projections*. Alias *term* would be a more
441
+ // appropriate name but alas.
442
+ ty:: AliasTy :: new ( tcx, assoc_item. def_id , alias_args)
439
443
} )
440
444
} ;
441
445
446
+ // FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
442
447
if !speculative {
443
448
// Find any late-bound regions declared in `ty` that are not
444
449
// declared in the trait-ref or assoc_item. These are not well-formed.
@@ -447,20 +452,20 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
447
452
//
448
453
// for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
449
454
// for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
450
- if let ConvertedBindingKind :: Equality ( ty ) = binding. kind {
451
- let late_bound_in_trait_ref =
455
+ if let ConvertedBindingKind :: Equality ( term ) = binding. kind {
456
+ let late_bound_in_projection_ty =
452
457
tcx. collect_constrained_late_bound_regions ( & projection_ty) ;
453
- let late_bound_in_ty =
454
- tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( ty . node ) ) ;
455
- debug ! ( ?late_bound_in_trait_ref ) ;
456
- debug ! ( ?late_bound_in_ty ) ;
458
+ let late_bound_in_term =
459
+ tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( term . node ) ) ;
460
+ debug ! ( ?late_bound_in_projection_ty ) ;
461
+ debug ! ( ?late_bound_in_term ) ;
457
462
458
463
// FIXME: point at the type params that don't have appropriate lifetimes:
459
464
// struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
460
465
// ---- ---- ^^^^^^^
461
466
self . validate_late_bound_regions (
462
- late_bound_in_trait_ref ,
463
- late_bound_in_ty ,
467
+ late_bound_in_projection_ty ,
468
+ late_bound_in_term ,
464
469
|br_name| {
465
470
struct_span_err ! (
466
471
tcx. dcx( ) ,
0 commit comments