@@ -289,8 +289,37 @@ fn associated_item_for_impl_trait_in_trait(
289289 InternalSubsts :: identity_for_item ( tcx, opaque_ty_def_id. to_def_id ( ) ) ,
290290 ) ) ) ;
291291
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+ } ) ;
294323
295324 // There are no predicates for the synthesized associated type.
296325 trait_assoc_ty. explicit_predicates_of ( ty:: GenericPredicates {
0 commit comments