@@ -289,8 +289,37 @@ fn associated_item_for_impl_trait_in_trait(
289
289
InternalSubsts :: identity_for_item ( tcx, opaque_ty_def_id. to_def_id ( ) ) ,
290
290
) ) ) ;
291
291
292
- // Copy generics_of of the opaque.
293
- trait_assoc_ty. generics_of ( tcx. generics_of ( opaque_ty_def_id) . clone ( ) ) ;
292
+ // Copy generics_of of the opaque type item but the trait is the parent.
293
+ trait_assoc_ty. generics_of ( {
294
+ let opaque_ty_generics = tcx. generics_of ( opaque_ty_def_id) ;
295
+ let opaque_ty_parent_count = opaque_ty_generics. parent_count ;
296
+ let mut params = opaque_ty_generics. params . clone ( ) ;
297
+
298
+ let parent_generics = tcx. generics_of ( trait_def_id) ;
299
+ let parent_count = parent_generics. parent_count + parent_generics. params . len ( ) ;
300
+
301
+ let mut trait_fn_params = tcx. generics_of ( fn_def_id) . params . clone ( ) ;
302
+
303
+ for param in & mut params {
304
+ param. index = param. index + parent_count as u32 + trait_fn_params. len ( ) as u32
305
+ - opaque_ty_parent_count as u32 ;
306
+ }
307
+
308
+ trait_fn_params. extend ( params) ;
309
+ params = trait_fn_params;
310
+
311
+ let param_def_id_to_index =
312
+ params. iter ( ) . map ( |param| ( param. def_id , param. index ) ) . collect ( ) ;
313
+
314
+ ty:: Generics {
315
+ parent : Some ( trait_def_id) ,
316
+ parent_count,
317
+ params,
318
+ param_def_id_to_index,
319
+ has_self : false ,
320
+ has_late_bound_regions : opaque_ty_generics. has_late_bound_regions ,
321
+ }
322
+ } ) ;
294
323
295
324
// There are no predicates for the synthesized associated type.
296
325
trait_assoc_ty. explicit_predicates_of ( ty:: GenericPredicates {
0 commit comments