@@ -461,13 +461,7 @@ fn clean_projection<'tcx>(
461
461
def_id : Option < DefId > ,
462
462
) -> Type {
463
463
if cx. tcx . is_impl_trait_in_trait ( ty. skip_binder ( ) . def_id ) {
464
- let bounds = cx
465
- . tcx
466
- . explicit_item_bounds ( ty. skip_binder ( ) . def_id )
467
- . iter_instantiated_copied ( cx. tcx , ty. skip_binder ( ) . args )
468
- . map ( |( pred, _) | pred)
469
- . collect :: < Vec < _ > > ( ) ;
470
- return clean_middle_opaque_bounds ( cx, bounds) ;
464
+ return clean_middle_opaque_bounds ( cx, ty. skip_binder ( ) . def_id , ty. skip_binder ( ) . args ) ;
471
465
}
472
466
473
467
let trait_ = clean_trait_ref_with_constraints (
@@ -2243,13 +2237,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
2243
2237
* cx. current_type_aliases . entry ( def_id) . or_insert ( 0 ) += 1 ;
2244
2238
// Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
2245
2239
// by looking up the bounds associated with the def_id.
2246
- let bounds = cx
2247
- . tcx
2248
- . explicit_item_bounds ( def_id)
2249
- . iter_instantiated_copied ( cx. tcx , args)
2250
- . map ( |( bound, _) | bound)
2251
- . collect :: < Vec < _ > > ( ) ;
2252
- let ty = clean_middle_opaque_bounds ( cx, bounds) ;
2240
+ let ty = clean_middle_opaque_bounds ( cx, def_id, args) ;
2253
2241
if let Some ( count) = cx. current_type_aliases . get_mut ( & def_id) {
2254
2242
* count -= 1 ;
2255
2243
if * count == 0 {
@@ -2272,12 +2260,20 @@ pub(crate) fn clean_middle_ty<'tcx>(
2272
2260
2273
2261
fn clean_middle_opaque_bounds < ' tcx > (
2274
2262
cx : & mut DocContext < ' tcx > ,
2275
- bounds : Vec < ty:: Clause < ' tcx > > ,
2263
+ impl_trait_def_id : DefId ,
2264
+ args : ty:: GenericArgsRef < ' tcx > ,
2276
2265
) -> Type {
2277
2266
let mut has_sized = false ;
2267
+
2268
+ let bounds: Vec < _ > = cx
2269
+ . tcx
2270
+ . explicit_item_bounds ( impl_trait_def_id)
2271
+ . iter_instantiated_copied ( cx. tcx , args)
2272
+ . collect ( ) ;
2273
+
2278
2274
let mut bounds = bounds
2279
2275
. iter ( )
2280
- . filter_map ( |bound| {
2276
+ . filter_map ( |( bound, _ ) | {
2281
2277
let bound_predicate = bound. kind ( ) ;
2282
2278
let trait_ref = match bound_predicate. skip_binder ( ) {
2283
2279
ty:: ClauseKind :: Trait ( tr) => bound_predicate. rebind ( tr. trait_ref ) ,
@@ -2296,7 +2292,7 @@ fn clean_middle_opaque_bounds<'tcx>(
2296
2292
2297
2293
let bindings: ThinVec < _ > = bounds
2298
2294
. iter ( )
2299
- . filter_map ( |bound| {
2295
+ . filter_map ( |( bound, _ ) | {
2300
2296
if let ty:: ClauseKind :: Projection ( proj) = bound. kind ( ) . skip_binder ( ) {
2301
2297
if proj. projection_term . trait_ref ( cx. tcx ) == trait_ref. skip_binder ( ) {
2302
2298
Some ( AssocItemConstraint {
@@ -2336,6 +2332,10 @@ fn clean_middle_opaque_bounds<'tcx>(
2336
2332
bounds. insert ( 0 , GenericBound :: sized ( cx) ) ;
2337
2333
}
2338
2334
2335
+ if let Some ( args) = cx. tcx . rendered_precise_capturing_args ( impl_trait_def_id) {
2336
+ bounds. push ( GenericBound :: Use ( args. to_vec ( ) ) ) ;
2337
+ }
2338
+
2339
2339
ImplTrait ( bounds)
2340
2340
}
2341
2341
0 commit comments