@@ -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
@@ -228,7 +226,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
228
226
& self ,
229
227
hir_ref_id : hir:: HirId ,
230
228
trait_ref : ty:: PolyTraitRef < ' tcx > ,
231
- binding : & ConvertedBinding < ' _ , ' tcx > ,
229
+ binding : & hir :: TypeBinding < ' _ > ,
232
230
bounds : & mut Bounds < ' tcx > ,
233
231
speculative : bool ,
234
232
dup_bindings : & mut FxHashMap < DefId , Span > ,
@@ -255,21 +253,20 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
255
253
256
254
let tcx = self . tcx ( ) ;
257
255
258
- let assoc_kind =
259
- if binding. gen_args . parenthesized == hir:: GenericArgsParentheses :: ReturnTypeNotation {
260
- ty:: AssocKind :: Fn
261
- } else if let ConvertedBindingKind :: Equality ( term) = binding. kind
262
- && let ty:: TermKind :: Const ( _) = term. node . unpack ( )
263
- {
264
- ty:: AssocKind :: Const
265
- } else {
266
- ty:: AssocKind :: Type
267
- } ;
256
+ let assoc_kind = if binding. gen_args . parenthesized
257
+ == hir:: GenericArgsParentheses :: ReturnTypeNotation
258
+ {
259
+ ty:: AssocKind :: Fn
260
+ } else if let hir:: TypeBindingKind :: Equality { term : hir:: Term :: Const ( _) } = binding. kind {
261
+ ty:: AssocKind :: Const
262
+ } else {
263
+ ty:: AssocKind :: Type
264
+ } ;
268
265
269
266
let candidate = if self . trait_defines_associated_item_named (
270
267
trait_ref. def_id ( ) ,
271
268
assoc_kind,
272
- binding. item_name ,
269
+ binding. ident ,
273
270
) {
274
271
// Simple case: The assoc item is defined in the current trait.
275
272
trait_ref
@@ -281,14 +278,14 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
281
278
trait_ref. skip_binder ( ) . print_only_trait_name ( ) ,
282
279
None ,
283
280
assoc_kind,
284
- binding. item_name ,
281
+ binding. ident ,
285
282
path_span,
286
- Some ( & binding) ,
283
+ Some ( binding) ,
287
284
) ?
288
285
} ;
289
286
290
287
let ( assoc_ident, def_scope) =
291
- tcx. adjust_ident_and_get_scope ( binding. item_name , candidate. def_id ( ) , hir_ref_id) ;
288
+ tcx. adjust_ident_and_get_scope ( binding. ident , candidate. def_id ( ) , hir_ref_id) ;
292
289
293
290
// We have already adjusted the item name above, so compare with `.normalize_to_macros_2_0()`
294
291
// instead of calling `filter_by_name_and_kind` which would needlessly normalize the
@@ -304,7 +301,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
304
301
. dcx ( )
305
302
. struct_span_err (
306
303
binding. span ,
307
- format ! ( "{} `{}` is private" , assoc_item. kind, binding. item_name ) ,
304
+ format ! ( "{} `{}` is private" , assoc_item. kind, binding. ident ) ,
308
305
)
309
306
. with_span_label ( binding. span , format ! ( "private {}" , assoc_item. kind) )
310
307
. emit ( ) ;
@@ -319,7 +316,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
319
316
tcx. dcx ( ) . emit_err ( errors:: ValueOfAssociatedStructAlreadySpecified {
320
317
span : binding. span ,
321
318
prev_span : * prev_span,
322
- item_name : binding. item_name ,
319
+ item_name : binding. ident ,
323
320
def_path : tcx. def_path_str ( assoc_item. container_id ( tcx) ) ,
324
321
} ) ;
325
322
} )
@@ -419,7 +416,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
419
416
// parent arguments (the arguments of the trait) and the own arguments (the ones of
420
417
// the associated item itself) and construct an alias type using them.
421
418
candidate. map_bound ( |trait_ref| {
422
- let ident = Ident :: new ( assoc_item. name , binding. item_name . span ) ;
419
+ let ident = Ident :: new ( assoc_item. name , binding. ident . span ) ;
423
420
let item_segment = hir:: PathSegment {
424
421
ident,
425
422
hir_id : binding. hir_id ,
@@ -443,65 +440,66 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
443
440
} )
444
441
} ;
445
442
446
- // FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
447
- if !speculative {
448
- // Find any late-bound regions declared in `ty` that are not
449
- // declared in the trait-ref or assoc_item. These are not well-formed.
450
- //
451
- // Example:
452
- //
453
- // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
454
- // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
455
- if let ConvertedBindingKind :: Equality ( term) = binding. kind {
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. node ) ) ;
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_code_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. item_name,
477
- br_name
478
- )
479
- } ,
480
- ) ;
481
- }
482
- }
483
-
484
443
match binding. kind {
485
- ConvertedBindingKind :: Equality ( .. ) if let ty:: AssocKind :: Fn = assoc_kind => {
444
+ hir :: TypeBindingKind :: Equality { .. } if let ty:: AssocKind :: Fn = assoc_kind => {
486
445
return Err ( tcx. dcx ( ) . emit_err ( crate :: errors:: ReturnTypeNotationEqualityBound {
487
446
span : binding. span ,
488
447
} ) ) ;
489
448
}
490
- ConvertedBindingKind :: Equality ( term) => {
449
+ hir:: TypeBindingKind :: Equality { term } => {
450
+ let term = match term {
451
+ hir:: Term :: Ty ( ty) => self . ast_ty_to_ty ( ty) . into ( ) ,
452
+ hir:: Term :: Const ( ct) => ty:: Const :: from_anon_const ( tcx, ct. def_id ) . into ( ) ,
453
+ } ;
454
+
455
+ // FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
456
+ if !speculative {
457
+ // Find any late-bound regions declared in `ty` that are not
458
+ // declared in the trait-ref or assoc_item. These are not well-formed.
459
+ //
460
+ // Example:
461
+ //
462
+ // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
463
+ // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
464
+ let late_bound_in_projection_ty =
465
+ tcx. collect_constrained_late_bound_regions ( & projection_ty) ;
466
+ let late_bound_in_term =
467
+ tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( term) ) ;
468
+ debug ! ( ?late_bound_in_projection_ty) ;
469
+ debug ! ( ?late_bound_in_term) ;
470
+
471
+ // FIXME: point at the type params that don't have appropriate lifetimes:
472
+ // struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
473
+ // ---- ---- ^^^^^^^
474
+ self . validate_late_bound_regions (
475
+ late_bound_in_projection_ty,
476
+ late_bound_in_term,
477
+ |br_name| {
478
+ struct_span_code_err ! (
479
+ tcx. dcx( ) ,
480
+ binding. span,
481
+ E0582 ,
482
+ "binding for associated type `{}` references {}, \
483
+ which does not appear in the trait input types",
484
+ binding. ident,
485
+ br_name
486
+ )
487
+ } ,
488
+ ) ;
489
+ }
490
+
491
491
// "Desugar" a constraint like `T: Iterator<Item = u32>` this to
492
492
// the "projection predicate" for:
493
493
//
494
494
// `<T as Iterator>::Item = u32`
495
495
bounds. push_projection_bound (
496
496
tcx,
497
- projection_ty. map_bound ( |projection_ty| ty:: ProjectionPredicate {
498
- projection_ty,
499
- term : term. node ,
500
- } ) ,
497
+ projection_ty
498
+ . map_bound ( |projection_ty| ty:: ProjectionPredicate { projection_ty, term } ) ,
501
499
binding. span ,
502
500
) ;
503
501
}
504
- ConvertedBindingKind :: Constraint ( ast_bounds) => {
502
+ hir :: TypeBindingKind :: Constraint { bounds : ast_bounds } => {
505
503
// "Desugar" a constraint like `T: Iterator<Item: Debug>` to
506
504
//
507
505
// `<T as Iterator>::Item: Debug`
0 commit comments