Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/eval.rs')
-rw-r--r--crates/hir-ty/src/mir/eval.rs25
1 files changed, 20 insertions, 5 deletions
diff --git a/crates/hir-ty/src/mir/eval.rs b/crates/hir-ty/src/mir/eval.rs
index c69febd019..855dafe2d9 100644
--- a/crates/hir-ty/src/mir/eval.rs
+++ b/crates/hir-ty/src/mir/eval.rs
@@ -3046,7 +3046,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
ty: Ty<'db>,
locals: &Locals<'a>,
addr: Address,
- _metadata: &[u8],
+ metadata: &[u8],
span: MirSpan,
) -> Result<'db, ()> {
let Some(drop_fn) = self.lang_items().Drop_drop else {
@@ -3056,13 +3056,23 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
};
let generic_args = GenericArgs::new_from_slice(&[ty.into()]);
- if let Ok(MirOrDynIndex::Mir(body)) =
- self.get_mir_or_dyn_index(drop_fn, generic_args, locals, span)
+ let (drop_impl, drop_args) = self.db.lookup_impl_method(
+ ParamEnvAndCrate { param_env: self.param_env.param_env, krate: self.crate_id },
+ drop_fn,
+ generic_args,
+ );
+ if let Either::Left(drop_impl) = drop_impl
+ && matches!(drop_impl.lookup(self.db).container, ItemContainerId::ImplId(_))
+ && let Ok(body) = self.db.monomorphized_mir_body(
+ drop_impl.into(),
+ drop_args.store(),
+ self.param_env.store(),
+ )
{
self.exec_looked_up_function(
body,
locals,
- drop_fn,
+ drop_impl,
iter::once(IntervalOrOwned::Owned(addr.to_bytes().to_vec())),
span,
Interval { addr: Address::Invalid(0), size: 0 },
@@ -3103,6 +3113,12 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
AdtId::EnumId(_) => (),
}
}
+ TyKind::Dynamic(..) => {
+ if !metadata.is_empty() {
+ let concrete_ty = self.vtable_map.ty_of_bytes(metadata)?;
+ self.run_drop_glue_deep(concrete_ty, locals, addr, &[], span)?;
+ }
+ }
TyKind::Bool
| TyKind::Char
| TyKind::Int(_)
@@ -3125,7 +3141,6 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
| TyKind::Error(_)
| TyKind::Param(_)
| TyKind::Placeholder(_)
- | TyKind::Dynamic(..)
| TyKind::FnPtr(..)
| TyKind::Bound(..)
| TyKind::Infer(..)