Skip to content

Commit 39ffe96

Browse files
committed
Properly implement generics_of for traits
1 parent 26c4c1e commit 39ffe96

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

compiler/rustc_ty_utils/src/assoc.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)