diff options
| author | Michael Goulet <michael@errs.io> | 2024-06-14 20:35:45 -0400 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-06-14 20:35:45 -0400 |
| commit | 3b9adbec32757264ba30b68e04ce66d6023810aa (patch) | |
| tree | bd4fd5886f0ad837424f46980f3196a912aafe62 /compiler/rustc_ty_utils/src/instance.rs | |
| parent | f8e566053207b4ecbcbc7a7d6ded82c43061e3da (diff) | |
| download | rust-3b9adbec32757264ba30b68e04ce66d6023810aa.tar.gz rust-3b9adbec32757264ba30b68e04ce66d6023810aa.zip | |
Only compute vtable information during codegen
Diffstat (limited to 'compiler/rustc_ty_utils/src/instance.rs')
| -rw-r--r-- | compiler/rustc_ty_utils/src/instance.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/compiler/rustc_ty_utils/src/instance.rs b/compiler/rustc_ty_utils/src/instance.rs index e4dcea785d4..2d87975c759 100644 --- a/compiler/rustc_ty_utils/src/instance.rs +++ b/compiler/rustc_ty_utils/src/instance.rs @@ -212,13 +212,23 @@ fn resolve_associated_item<'tcx>( Some(ty::Instance::new(leaf_def.item.def_id, args)) } - traits::ImplSource::Builtin(BuiltinImplSource::Object { vtable_base }, _) => { - traits::get_vtable_index_of_object_method(tcx, *vtable_base, trait_item_id).map( - |index| Instance { - def: ty::InstanceDef::Virtual(trait_item_id, index), + traits::ImplSource::Builtin(BuiltinImplSource::Object(_), _) => { + let trait_ref = ty::TraitRef::from_method(tcx, trait_id, rcvr_args); + if trait_ref.has_non_region_infer() || trait_ref.has_non_region_param() { + // We only resolve totally substituted vtable entries. + None + } else { + let vtable_base = tcx.first_method_vtable_slot(trait_ref); + let offset = tcx + .own_existential_vtable_entries(trait_id) + .iter() + .copied() + .position(|def_id| def_id == trait_item_id); + offset.map(|offset| Instance { + def: ty::InstanceDef::Virtual(trait_item_id, vtable_base + offset), args: rcvr_args, - }, - ) + }) + } } traits::ImplSource::Builtin(BuiltinImplSource::Misc, _) => { let lang_items = tcx.lang_items(); |
