@@ -9,9 +9,7 @@ use rustc_span::{ErrorGuaranteed, Span};
99use rustc_trait_selection:: traits;
1010use smallvec:: SmallVec ;
1111
12- use crate :: astconv:: {
13- AstConv , ConvertedBinding , ConvertedBindingKind , OnlySelfBounds , PredicateFilter ,
14- } ;
12+ use crate :: astconv:: { AstConv , OnlySelfBounds , PredicateFilter } ;
1513use crate :: bounds:: Bounds ;
1614use crate :: errors;
1715
@@ -228,7 +226,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
228226 & self ,
229227 hir_ref_id : hir:: HirId ,
230228 trait_ref : ty:: PolyTraitRef < ' tcx > ,
231- binding : & ConvertedBinding < ' _ , ' tcx > ,
229+ binding : & hir :: TypeBinding < ' _ > ,
232230 bounds : & mut Bounds < ' tcx > ,
233231 speculative : bool ,
234232 dup_bindings : & mut FxHashMap < DefId , Span > ,
@@ -255,21 +253,20 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
255253
256254 let tcx = self . tcx ( ) ;
257255
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+ } ;
268265
269266 let candidate = if self . trait_defines_associated_item_named (
270267 trait_ref. def_id ( ) ,
271268 assoc_kind,
272- binding. item_name ,
269+ binding. ident ,
273270 ) {
274271 // Simple case: The assoc item is defined in the current trait.
275272 trait_ref
@@ -281,14 +278,14 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
281278 trait_ref. skip_binder ( ) . print_only_trait_name ( ) ,
282279 None ,
283280 assoc_kind,
284- binding. item_name ,
281+ binding. ident ,
285282 path_span,
286- Some ( & binding) ,
283+ Some ( binding) ,
287284 ) ?
288285 } ;
289286
290287 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) ;
292289
293290 // We have already adjusted the item name above, so compare with `.normalize_to_macros_2_0()`
294291 // instead of calling `filter_by_name_and_kind` which would needlessly normalize the
@@ -303,7 +300,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
303300 tcx. dcx ( )
304301 . struct_span_err (
305302 binding. span ,
306- format ! ( "{} `{}` is private" , assoc_item. kind, binding. item_name ) ,
303+ format ! ( "{} `{}` is private" , assoc_item. kind, binding. ident ) ,
307304 )
308305 . span_label_mv ( binding. span , format ! ( "private {}" , assoc_item. kind) )
309306 . emit ( ) ;
@@ -317,7 +314,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
317314 tcx. dcx ( ) . emit_err ( errors:: ValueOfAssociatedStructAlreadySpecified {
318315 span : binding. span ,
319316 prev_span : * prev_span,
320- item_name : binding. item_name ,
317+ item_name : binding. ident ,
321318 def_path : tcx. def_path_str ( assoc_item. container_id ( tcx) ) ,
322319 } ) ;
323320 } )
@@ -417,7 +414,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
417414 // parent arguments (the arguments of the trait) and the own arguments (the ones of
418415 // the associated item itself) and construct an alias type using them.
419416 candidate. map_bound ( |trait_ref| {
420- let ident = Ident :: new ( assoc_item. name , binding. item_name . span ) ;
417+ let ident = Ident :: new ( assoc_item. name , binding. ident . span ) ;
421418 let item_segment = hir:: PathSegment {
422419 ident,
423420 hir_id : binding. hir_id ,
@@ -441,65 +438,66 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
441438 } )
442439 } ;
443440
444- // FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
445- if !speculative {
446- // Find any late-bound regions declared in `ty` that are not
447- // declared in the trait-ref or assoc_item. These are not well-formed.
448- //
449- // Example:
450- //
451- // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
452- // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
453- if let ConvertedBindingKind :: Equality ( term) = binding. kind {
454- let late_bound_in_projection_ty =
455- tcx. collect_constrained_late_bound_regions ( & projection_ty) ;
456- let late_bound_in_term =
457- tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( term. node ) ) ;
458- debug ! ( ?late_bound_in_projection_ty) ;
459- debug ! ( ?late_bound_in_term) ;
460-
461- // FIXME: point at the type params that don't have appropriate lifetimes:
462- // struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
463- // ---- ---- ^^^^^^^
464- self . validate_late_bound_regions (
465- late_bound_in_projection_ty,
466- late_bound_in_term,
467- |br_name| {
468- struct_span_err ! (
469- tcx. dcx( ) ,
470- binding. span,
471- E0582 ,
472- "binding for associated type `{}` references {}, \
473- which does not appear in the trait input types",
474- binding. item_name,
475- br_name
476- )
477- } ,
478- ) ;
479- }
480- }
481-
482441 match binding. kind {
483- ConvertedBindingKind :: Equality ( .. ) if let ty:: AssocKind :: Fn = assoc_kind => {
442+ hir :: TypeBindingKind :: Equality { .. } if let ty:: AssocKind :: Fn = assoc_kind => {
484443 return Err ( tcx. dcx ( ) . emit_err ( crate :: errors:: ReturnTypeNotationEqualityBound {
485444 span : binding. span ,
486445 } ) ) ;
487446 }
488- ConvertedBindingKind :: Equality ( term) => {
447+ hir:: TypeBindingKind :: Equality { term } => {
448+ let term = match term {
449+ hir:: Term :: Ty ( ty) => self . ast_ty_to_ty ( ty) . into ( ) ,
450+ hir:: Term :: Const ( ct) => ty:: Const :: from_anon_const ( tcx, ct. def_id ) . into ( ) ,
451+ } ;
452+
453+ // FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
454+ if !speculative {
455+ // Find any late-bound regions declared in `ty` that are not
456+ // declared in the trait-ref or assoc_item. These are not well-formed.
457+ //
458+ // Example:
459+ //
460+ // for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
461+ // for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
462+ let late_bound_in_projection_ty =
463+ tcx. collect_constrained_late_bound_regions ( & projection_ty) ;
464+ let late_bound_in_term =
465+ tcx. collect_referenced_late_bound_regions ( & trait_ref. rebind ( term) ) ;
466+ debug ! ( ?late_bound_in_projection_ty) ;
467+ debug ! ( ?late_bound_in_term) ;
468+
469+ // FIXME: point at the type params that don't have appropriate lifetimes:
470+ // struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
471+ // ---- ---- ^^^^^^^
472+ self . validate_late_bound_regions (
473+ late_bound_in_projection_ty,
474+ late_bound_in_term,
475+ |br_name| {
476+ struct_span_err ! (
477+ tcx. dcx( ) ,
478+ binding. span,
479+ E0582 ,
480+ "binding for associated type `{}` references {}, \
481+ which does not appear in the trait input types",
482+ binding. ident,
483+ br_name
484+ )
485+ } ,
486+ ) ;
487+ }
488+
489489 // "Desugar" a constraint like `T: Iterator<Item = u32>` this to
490490 // the "projection predicate" for:
491491 //
492492 // `<T as Iterator>::Item = u32`
493493 bounds. push_projection_bound (
494494 tcx,
495- projection_ty. map_bound ( |projection_ty| ty:: ProjectionPredicate {
496- projection_ty,
497- term : term. node ,
498- } ) ,
495+ projection_ty
496+ . map_bound ( |projection_ty| ty:: ProjectionPredicate { projection_ty, term } ) ,
499497 binding. span ,
500498 ) ;
501499 }
502- ConvertedBindingKind :: Constraint ( ast_bounds) => {
500+ hir :: TypeBindingKind :: Constraint { bounds : ast_bounds } => {
503501 // "Desugar" a constraint like `T: Iterator<Item: Debug>` to
504502 //
505503 // `<T as Iterator>::Item: Debug`
0 commit comments