Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/eval/shim.rs')
-rw-r--r--crates/hir-ty/src/mir/eval/shim.rs31
1 files changed, 12 insertions, 19 deletions
diff --git a/crates/hir-ty/src/mir/eval/shim.rs b/crates/hir-ty/src/mir/eval/shim.rs
index 2aed76ec90..9586d38abc 100644
--- a/crates/hir-ty/src/mir/eval/shim.rs
+++ b/crates/hir-ty/src/mir/eval/shim.rs
@@ -6,18 +6,16 @@ use std::cmp::{self, Ordering};
use hir_def::{attrs::AttrFlags, signatures::FunctionSignature};
use hir_expand::name::Name;
use intern::sym;
-use rustc_type_ir::inherent::{AdtDef, IntoKind, SliceLike, Ty as _};
+use rustc_type_ir::inherent::{AdtDef, GenericArgs as _, IntoKind, SliceLike, Ty as _};
use stdx::never;
use crate::{
- InferenceResult,
display::DisplayTarget,
drop::{DropGlue, has_drop_glue},
mir::eval::{
- Address, AdtId, Arc, Evaluator, FunctionId, GenericArgs, HasModule, HirDisplay,
- InternedClosure, Interval, IntervalAndTy, IntervalOrOwned, ItemContainerId, Layout, Locals,
- Lookup, MirEvalError, MirSpan, Mutability, Result, Ty, TyKind, from_bytes, not_supported,
- pad16,
+ Address, AdtId, Arc, Evaluator, FunctionId, GenericArgs, HasModule, HirDisplay, Interval,
+ IntervalAndTy, IntervalOrOwned, ItemContainerId, Layout, Locals, Lookup, MirEvalError,
+ MirSpan, Mutability, Result, Ty, TyKind, from_bytes, not_supported, pad16,
},
next_solver::Region,
};
@@ -147,19 +145,14 @@ impl<'db> Evaluator<'db> {
return destination
.write_from_interval(self, Interval { addr, size: destination.size });
}
- TyKind::Closure(id, subst) => {
- let [arg] = args else {
- not_supported!("wrong arg count for clone");
- };
- let addr = Address::from_bytes(arg.get(self)?)?;
- let InternedClosure(owner, _) = self.db.lookup_intern_closure(id.0);
- let infer = InferenceResult::of(self.db, owner);
- let (captures, _) = infer.closure_info(id.0);
- let layout = self.layout(self_ty)?;
- let db = self.db;
- let ty_iter = captures.iter().map(|c| c.ty(db, subst));
- self.exec_clone_for_fields(ty_iter, layout, addr, def, locals, destination, span)?;
- }
+ TyKind::Closure(_, closure_args) => self.exec_clone(
+ def,
+ args,
+ closure_args.as_closure().tupled_upvars_ty(),
+ locals,
+ destination,
+ span,
+ )?,
TyKind::Tuple(subst) => {
let [arg] = args else {
not_supported!("wrong arg count for clone");