@@ -14,7 +14,8 @@ use crate::bounds::Bounds;
14
14
use crate :: errors;
15
15
16
16
impl < ' 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`.
18
19
pub ( crate ) fn add_implicit_sized_bound (
19
20
& self ,
20
21
bounds : & mut Bounds < ' tcx > ,
@@ -98,21 +99,21 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
98
99
}
99
100
}
100
101
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`.
103
103
///
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
107
109
/// |
108
110
/// `param_ty`, in ty form
109
111
/// ```
110
112
///
111
- /// It adds these `ast_bounds` into the `bounds` structure.
113
+ /// ### A Note on Binders
112
114
///
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.
116
117
#[ instrument( level = "debug" , skip( self , ast_bounds, bounds) ) ]
117
118
pub ( crate ) fn lower_bounds < ' hir , I : Iterator < Item = & ' hir hir:: GenericBound < ' tcx > > > (
118
119
& self ,
@@ -168,22 +169,18 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
168
169
}
169
170
}
170
171
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`.
173
174
///
174
- /// Example:
175
+ /// ### Example
175
176
///
176
177
/// ```ignore (illustrative)
177
178
/// fn foo<T: Bar + Baz>() { }
178
179
/// // ^ ^^^^^^^^^ ast_bounds
179
180
/// // param_ty
180
181
/// ```
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)?
187
184
pub ( crate ) fn compute_bounds (
188
185
& self ,
189
186
param_ty : Ty < ' tcx > ,
@@ -225,12 +222,14 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
225
222
bounds
226
223
}
227
224
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
230
229
///
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.
234
233
#[ instrument( level = "debug" , skip( self , bounds, speculative, dup_bindings, path_span) ) ]
235
234
pub ( super ) fn lower_assoc_item_binding (
236
235
& self ,
@@ -243,6 +242,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
243
242
path_span : Span ,
244
243
only_self_bounds : OnlySelfBounds ,
245
244
) -> Result < ( ) , ErrorGuaranteed > {
245
+ // FIXME(astconv-no-mo): Update this comment / move it someplace better.
246
246
// Given something like `U: SomeTrait<T = X>`, we want to produce a
247
247
// predicate like `<U as SomeTrait>::T = X`. This is somewhat
248
248
// subtle in the event that `T` is defined in a supertrait of
@@ -436,6 +436,8 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
436
436
span : binding. span ,
437
437
} ) ) ;
438
438
}
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`.
439
441
hir:: TypeBindingKind :: Equality { term } => {
440
442
let term = match term {
441
443
hir:: Term :: Ty ( ty) => self . lower_ty ( ty) . into ( ) ,
@@ -479,29 +481,21 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
479
481
) ;
480
482
}
481
483
482
- // "Desugar" a constraint like `T: Iterator<Item = u32>` this to
483
- // the "projection predicate" for:
484
- //
485
- // `<T as Iterator>::Item = u32`
486
484
bounds. push_projection_bound (
487
485
tcx,
488
486
projection_ty
489
487
. map_bound ( |projection_ty| ty:: ProjectionPredicate { projection_ty, term } ) ,
490
488
binding. span ,
491
489
) ;
492
490
}
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`.
493
493
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.
504
496
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.
505
499
let param_ty = Ty :: new_alias ( tcx, ty:: Projection , projection_ty. skip_binder ( ) ) ;
506
500
self . lower_bounds (
507
501
param_ty,
0 commit comments