@@ -14,7 +14,8 @@ use crate::bounds::Bounds;
1414use crate :: errors;
1515
1616impl < ' tcx > dyn HirTyLowerer < ' tcx > + ' _ {
17- /// Sets `implicitly_sized` to true on `Bounds` if necessary
17+ /// Add a `Sized` bound to the `bounds` unless the HIR bounds contain any of
18+ /// `Sized`, `?Sized` or `!Sized`.
1819 pub ( crate ) fn add_implicit_sized_bound (
1920 & self ,
2021 bounds : & mut Bounds < ' tcx > ,
@@ -98,21 +99,21 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
9899 }
99100 }
100101
101- /// This helper takes a *converted* parameter type (`param_ty`)
102- /// and an *unconverted* list of bounds:
102+ /// Lower HIR bounds into `bounds` given the self type `param_ty`.
103103 ///
104- /// ```text
105- /// fn foo<T: Debug>
106- /// ^ ^^^^^ `ast_bounds` parameter, in HIR form
104+ /// ### Example
105+ ///
106+ /// ```ignore (illustrative)
107+ /// fn foo<T: Debug>() { }
108+ /// ^ ^^^^^ `ast_bounds`, in HIR form
107109 /// |
108110 /// `param_ty`, in ty form
109111 /// ```
110112 ///
111- /// It adds these `ast_bounds` into the `bounds` structure.
113+ /// ### A Note on Binders
112114 ///
113- /// **A note on binders:** there is an implied binder around
114- /// `param_ty` and `ast_bounds`. See `instantiate_poly_trait_ref`
115- /// for more details.
115+ /// There is an implied binder around `param_ty` and `ast_bounds`.
116+ /// See `lower_poly_trait_ref` for more details.
116117 #[ instrument( level = "debug" , skip( self , ast_bounds, bounds) ) ]
117118 pub ( crate ) fn lower_bounds < ' hir , I : Iterator < Item = & ' hir hir:: GenericBound < ' tcx > > > (
118119 & self ,
@@ -168,22 +169,18 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
168169 }
169170 }
170171
171- /// Translates a list of bounds from the HIR into the `Bounds` data structure .
172- /// The self-type for the bounds is given by `param_ty`.
172+ // FIXME(astconv-no-mo): Currently this has the same docs as `lower_bounds` .
173+ /// Lower HIR bounds into ` bounds` given the self type `param_ty`.
173174 ///
174- /// Example:
175+ /// ### Example
175176 ///
176177 /// ```ignore (illustrative)
177178 /// fn foo<T: Bar + Baz>() { }
178179 /// // ^ ^^^^^^^^^ ast_bounds
179180 /// // param_ty
180181 /// ```
181- ///
182- /// The `sized_by_default` parameter indicates if, in this context, the `param_ty` should be
183- /// considered `Sized` unless there is an explicit `?Sized` bound. This would be true in the
184- /// example above, but is not true in supertrait listings like `trait Foo: Bar + Baz`.
185- ///
186- /// `span` should be the declaration size of the parameter.
182+ // FIXME(astconv-no-more): This should renamed to make it clear how it differs from `lower_bounds`
183+ // Maybe `lower_mono_bounds` (as in no bound vars)?
187184 pub ( crate ) fn compute_bounds (
188185 & self ,
189186 param_ty : Ty < ' tcx > ,
@@ -225,12 +222,14 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
225222 bounds
226223 }
227224
228- /// Given an HIR binding like `Item = Foo` or `Item: Foo`, pushes the corresponding predicates
229- /// onto `bounds`.
225+ // FIXME(astconv-no-mo): Expand these docs!
226+ /// Lower an associated item binding from HIR into `bounds`.
227+ ///
228+ /// ### A Note on Binders
230229 ///
231- /// **A note on binders:** given something like `T: for<'a> Iterator<Item = &'a u32>`, the
232- /// `trait_ref` here will be ` for<'a> T: Iterator`. The `binding` data however is from *inside*
233- /// the binder (e.g., `&'a u32`) and hence may reference bound regions.
230+ /// Given something like `T: for<'a> Iterator<Item = &'a u32>`, the `trait_ref` here will be
231+ /// `for<'a> T: Iterator`. The `binding` data however is from *inside* the binder (e.g., `&'a u32`)
232+ /// and hence may reference bound regions.
234233 #[ instrument( level = "debug" , skip( self , bounds, speculative, dup_bindings, path_span) ) ]
235234 pub ( super ) fn lower_assoc_item_binding (
236235 & self ,
@@ -243,6 +242,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
243242 path_span : Span ,
244243 only_self_bounds : OnlySelfBounds ,
245244 ) -> Result < ( ) , ErrorGuaranteed > {
245+ // FIXME(astconv-no-mo): Update this comment / move it someplace better.
246246 // Given something like `U: SomeTrait<T = X>`, we want to produce a
247247 // predicate like `<U as SomeTrait>::T = X`. This is somewhat
248248 // subtle in the event that `T` is defined in a supertrait of
@@ -436,6 +436,8 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
436436 span : binding. span ,
437437 } ) ) ;
438438 }
439+ // Lower an equality constraint like `Item = u32` as found in HIR bound `T: Iterator<Item = u32>`
440+ // to a projection predicate: `<T as Iterator>::Item = u32`.
439441 hir:: TypeBindingKind :: Equality { term } => {
440442 let term = match term {
441443 hir:: Term :: Ty ( ty) => self . lower_ty ( ty) . into ( ) ,
@@ -479,29 +481,21 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
479481 ) ;
480482 }
481483
482- // "Desugar" a constraint like `T: Iterator<Item = u32>` this to
483- // the "projection predicate" for:
484- //
485- // `<T as Iterator>::Item = u32`
486484 bounds. push_projection_bound (
487485 tcx,
488486 projection_ty
489487 . map_bound ( |projection_ty| ty:: ProjectionPredicate { projection_ty, term } ) ,
490488 binding. span ,
491489 ) ;
492490 }
491+ // Lower a constraint like `Item: Debug` as found in HIR bound `T: Iterator<Item: Debug>`
492+ // to a bound involving a projection: `<T as Iterator>::Item: Debug`.
493493 hir:: TypeBindingKind :: Constraint { bounds : ast_bounds } => {
494- // "Desugar" a constraint like `T: Iterator<Item: Debug>` to
495- //
496- // `<T as Iterator>::Item: Debug`
497- //
498- // Calling `skip_binder` is okay, because `add_bounds` expects the `param_ty`
499- // parameter to have a skipped binder.
500- //
501- // NOTE: If `only_self_bounds` is true, do NOT expand this associated
502- // type bound into a trait predicate, since we only want to add predicates
503- // for the `Self` type.
494+ // NOTE: If `only_self_bounds` is true, do NOT expand this associated type bound into
495+ // a trait predicate, since we only want to add predicates for the `Self` type.
504496 if !only_self_bounds. 0 {
497+ // Calling `skip_binder` is okay, because `lower_bounds` expects the `param_ty`
498+ // parameter to have a skipped binder.
505499 let param_ty = Ty :: new_alias ( tcx, ty:: Projection , projection_ty. skip_binder ( ) ) ;
506500 self . lower_bounds (
507501 param_ty,
0 commit comments