@@ -9,9 +9,7 @@ use rustc_span::{ErrorGuaranteed, Span};
9
9
use rustc_trait_selection:: traits;
10
10
use smallvec:: SmallVec ;
11
11
12
- use crate :: astconv:: {
13
- AstConv , ConvertedBinding , ConvertedBindingKind , OnlySelfBounds , PredicateFilter ,
14
- } ;
12
+ use crate :: astconv:: { AstConv , OnlySelfBounds , PredicateFilter } ;
15
13
use crate :: bounds:: Bounds ;
16
14
use crate :: errors;
17
15
@@ -220,7 +218,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
220
218
& self ,
221
219
hir_ref_id : hir:: HirId ,
222
220
trait_ref : ty:: PolyTraitRef < ' tcx > ,
223
- binding : & ConvertedBinding < ' _ , ' tcx > ,
221
+ binding : & hir :: TypeBinding < ' _ > ,
224
222
bounds : & mut Bounds < ' tcx > ,
225
223
speculative : bool ,
226
224
dup_bindings : & mut FxHashMap < DefId , Span > ,
@@ -247,21 +245,20 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
247
245
248
246
let tcx = self . tcx ( ) ;
249
247
250
- let assoc_kind =
251
- if binding. gen_args . parenthesized == hir:: GenericArgsParentheses :: ReturnTypeNotation {
252
- ty:: AssocKind :: Fn
253
- } else if let ConvertedBindingKind :: Equality ( term) = binding. kind
254
- && let ty:: TermKind :: Const ( _) = term. node . unpack ( )
255
- {
256
- ty:: AssocKind :: Const
257
- } else {
258
- ty:: AssocKind :: Type
259
- } ;
248
+ let assoc_kind = if binding. gen_args . parenthesized
249
+ == hir:: GenericArgsParentheses :: ReturnTypeNotation
250
+ {
251
+ ty:: AssocKind :: Fn
252
+ } else if let hir:: TypeBindingKind :: Equality { term : hir:: Term :: Const ( _) } = binding. kind {
253
+ ty:: AssocKind :: Const
254
+ } else {
255
+ ty:: AssocKind :: Type
256
+ } ;
260
257
261
258
let candidate = if self . trait_defines_associated_item_named (
262
259
trait_ref. def_id ( ) ,
263
260
assoc_kind,
264
- binding. item_name ,
261
+ binding. ident ,
265
262
) {
266
263
// Simple case: The assoc item is defined in the current trait.
267
264
trait_ref
@@ -273,14 +270,14 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
273
270
trait_ref. skip_binder ( ) . print_only_trait_name ( ) ,
274
271
None ,
275
272
assoc_kind,
276
- binding. item_name ,
273
+ binding. ident ,
277
274
path_span,
278
- Some ( & binding) ,
275
+ Some ( binding) ,
279
276
) ?
280
277
} ;
281
278
282
279
let ( assoc_ident, def_scope) =
283
- tcx. adjust_ident_and_get_scope ( binding. item_name , candidate. def_id ( ) , hir_ref_id) ;
280
+ tcx. adjust_ident_and_get_scope ( binding. ident , candidate. def_id ( ) , hir_ref_id) ;
284
281
285
282
// We have already adjusted the item name above, so compare with `.normalize_to_macros_2_0()`
286
283
// instead of calling `filter_by_name_and_kind` which would needlessly normalize the
@@ -295,7 +292,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
295
292
tcx. dcx ( )
296
293
. struct_span_err (
297
294
binding. span ,
298
- format ! ( "{} `{}` is private" , assoc_item. kind, binding. item_name ) ,
295
+ format ! ( "{} `{}` is private" , assoc_item. kind, binding. ident ) ,
299
296
)
300
297
. span_label ( binding. span , format ! ( "private {}" , assoc_item. kind) )
301
298
. emit ( ) ;
@@ -309,7 +306,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
309
306
tcx. dcx ( ) . emit_err ( errors:: ValueOfAssociatedStructAlreadySpecified {
310
307
span : binding. span ,
311
308
prev_span : * prev_span,
312
- item_name : binding. item_name ,
309
+ item_name : binding. ident ,
313
310
def_path : tcx. def_path_str ( assoc_item. container_id ( tcx) ) ,
314
311
} ) ;
315
312
} )
@@ -409,7 +406,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
409
406
} else {
410
407
// Append the generic arguments of the associated type or const to the `trait_ref`.
411
408
candidate. map_bound ( |trait_ref| {
412
- let ident = Ident :: new ( assoc_item. name , binding. item_name . span ) ;
409
+ let ident = Ident :: new ( assoc_item. name , binding. ident . span ) ;
413
410
let item_segment = hir:: PathSegment {
414
411
ident,
415
412
hir_id : binding. hir_id ,
@@ -433,67 +430,68 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
433
430
} )
434
431
} ;
435
432
436
- // FIXME(fmease): This doesn't check actually seem to work for assoc consts.
437
- // We want to deny escaping late-bound vars in general anyways for assoc consts.
438
- // If the diagnostic *is* reachable, update it (“type” → “term” or similar).
439
- if !speculative {
440
- // Find any late-bound regions declared in `ty` that are not
441
- // declared in the trait-ref or assoc_item. These are not well-formed.
442
- //
443
- // Example:
444
- //
445
- // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
446
- // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
447
- if let ConvertedBindingKind :: Equality ( term) = binding. kind {
448
- let late_bound_in_projection_ty =
449
- tcx. collect_constrained_late_bound_regions ( & projection_ty) ;
450
- let late_bound_in_term =
451
- tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( term. node ) ) ;
452
- debug ! ( ?late_bound_in_projection_ty) ;
453
- debug ! ( ?late_bound_in_term) ;
454
-
455
- // FIXME: point at the type params that don't have appropriate lifetimes:
456
- // struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
457
- // ---- ---- ^^^^^^^
458
- self . validate_late_bound_regions (
459
- late_bound_in_projection_ty,
460
- late_bound_in_term,
461
- |br_name| {
462
- struct_span_err ! (
463
- tcx. dcx( ) ,
464
- binding. span,
465
- E0582 ,
466
- "binding for associated type `{}` references {}, \
467
- which does not appear in the trait input types",
468
- binding. item_name,
469
- br_name
470
- )
471
- } ,
472
- ) ;
473
- }
474
- }
475
-
476
433
match binding. kind {
477
- ConvertedBindingKind :: Equality ( .. ) if let ty:: AssocKind :: Fn = assoc_kind => {
434
+ hir :: TypeBindingKind :: Equality { .. } if let ty:: AssocKind :: Fn = assoc_kind => {
478
435
return Err ( self . tcx ( ) . dcx ( ) . emit_err (
479
436
crate :: errors:: ReturnTypeNotationEqualityBound { span : binding. span } ,
480
437
) ) ;
481
438
}
482
- ConvertedBindingKind :: Equality ( term) => {
439
+ hir:: TypeBindingKind :: Equality { term } => {
440
+ let term = match term {
441
+ hir:: Term :: Ty ( ty) => self . ast_ty_to_ty ( ty) . into ( ) ,
442
+ hir:: Term :: Const ( ct) => ty:: Const :: from_anon_const ( tcx, ct. def_id ) . into ( ) ,
443
+ } ;
444
+
445
+ // FIXME(fmease): This doesn't check actually seem to work for assoc consts.
446
+ // We want to deny escaping late-bound vars in general anyways for assoc consts.
447
+ // If the diagnostic *is* reachable, update it (“type” → “term” or similar).
448
+ if !speculative {
449
+ // Find any late-bound regions declared in `ty` that are not
450
+ // declared in the trait-ref or assoc_item. These are not well-formed.
451
+ //
452
+ // Example:
453
+ //
454
+ // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
455
+ // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
456
+ let late_bound_in_projection_ty =
457
+ tcx. collect_constrained_late_bound_regions ( & projection_ty) ;
458
+ let late_bound_in_term =
459
+ tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( term) ) ;
460
+ debug ! ( ?late_bound_in_projection_ty) ;
461
+ debug ! ( ?late_bound_in_term) ;
462
+
463
+ // FIXME: point at the type params that don't have appropriate lifetimes:
464
+ // struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
465
+ // ---- ---- ^^^^^^^
466
+ self . validate_late_bound_regions (
467
+ late_bound_in_projection_ty,
468
+ late_bound_in_term,
469
+ |br_name| {
470
+ struct_span_err ! (
471
+ tcx. dcx( ) ,
472
+ binding. span,
473
+ E0582 ,
474
+ "binding for associated type `{}` references {}, \
475
+ which does not appear in the trait input types",
476
+ binding. ident,
477
+ br_name
478
+ )
479
+ } ,
480
+ ) ;
481
+ }
482
+
483
483
// "Desugar" a constraint like `T: Iterator<Item = u32>` this to
484
484
// the "projection predicate" for:
485
485
//
486
486
// `<T as Iterator>::Item = u32`
487
487
bounds. push_projection_bound (
488
488
tcx,
489
- projection_ty. map_bound ( |projection_ty| ty:: ProjectionPredicate {
490
- projection_ty,
491
- term : term. node ,
492
- } ) ,
489
+ projection_ty
490
+ . map_bound ( |projection_ty| ty:: ProjectionPredicate { projection_ty, term } ) ,
493
491
binding. span ,
494
492
) ;
495
493
}
496
- ConvertedBindingKind :: Constraint ( ast_bounds) => {
494
+ hir :: TypeBindingKind :: Constraint { bounds : ast_bounds } => {
497
495
// "Desugar" a constraint like `T: Iterator<Item: Debug>` to
498
496
//
499
497
// `<T as Iterator>::Item: Debug`
0 commit comments