Properly implement generics_of for traits

This commit is contained in:
Santiago Pastorino 2023-03-14 14:29:06 -03:00
parent 26c4c1ea97
commit 39ffe9699a
No known key found for this signature in database
GPG Key ID: 8131A24E0C79EFAF

View File

@ -289,8 +289,37 @@ fn associated_item_for_impl_trait_in_trait(
InternalSubsts::identity_for_item(tcx, opaque_ty_def_id.to_def_id()),
)));
// Copy generics_of of the opaque.
trait_assoc_ty.generics_of(tcx.generics_of(opaque_ty_def_id).clone());
// Copy generics_of of the opaque type item but the trait is the parent.
trait_assoc_ty.generics_of({
let opaque_ty_generics = tcx.generics_of(opaque_ty_def_id);
let opaque_ty_parent_count = opaque_ty_generics.parent_count;
let mut params = opaque_ty_generics.params.clone();
let parent_generics = tcx.generics_of(trait_def_id);
let parent_count = parent_generics.parent_count + parent_generics.params.len();
let mut trait_fn_params = tcx.generics_of(fn_def_id).params.clone();
for param in &mut params {
param.index = param.index + parent_count as u32 + trait_fn_params.len() as u32
- opaque_ty_parent_count as u32;
}
trait_fn_params.extend(params);
params = trait_fn_params;
let param_def_id_to_index =
params.iter().map(|param| (param.def_id, param.index)).collect();
ty::Generics {
parent: Some(trait_def_id),
parent_count,
params,
param_def_id_to_index,
has_self: false,
has_late_bound_regions: opaque_ty_generics.has_late_bound_regions,
}
});
// There are no predicates for the synthesized associated type.
trait_assoc_ty.explicit_predicates_of(ty::GenericPredicates {