Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/lower.rs')
-rw-r--r--crates/hir-ty/src/mir/lower.rs196
1 files changed, 108 insertions, 88 deletions
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index 3e44e8c68d..ec7bff7082 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -20,6 +20,7 @@ use hir_expand::name::Name;
use la_arena::ArenaMap;
use rustc_apfloat::Float;
use rustc_hash::FxHashMap;
+use rustc_type_ir::inherent::IntoKind;
use span::{Edition, FileId};
use syntax::TextRange;
use triomphe::Arc;
@@ -74,24 +75,25 @@ struct DropScope {
locals: Vec<LocalId>,
}
-struct MirLowerCtx<'db> {
+struct MirLowerCtx<'a, 'db> {
result: MirBody,
owner: DefWithBodyId,
current_loop_blocks: Option<LoopBlocks>,
labeled_loop_blocks: FxHashMap<LabelId, LoopBlocks>,
discr_temp: Option<Place>,
db: &'db dyn HirDatabase,
- body: &'db Body,
- infer: &'db InferenceResult,
+ body: &'a Body,
+ infer: &'a InferenceResult<'db>,
resolver: Resolver<'db>,
drop_scopes: Vec<DropScope>,
env: Arc<TraitEnvironment<'db>>,
+ interner: DbInterner<'db>,
}
// FIXME: Make this smaller, its stored in database queries
#[derive(Debug, Clone, PartialEq, Eq)]
-pub enum MirLowerError {
- ConstEvalError(Box<str>, Box<ConstEvalError>),
+pub enum MirLowerError<'db> {
+ ConstEvalError(Box<str>, Box<ConstEvalError<'db>>),
LayoutError(LayoutError),
IncompleteExpr,
IncompletePattern,
@@ -103,7 +105,7 @@ pub enum MirLowerError {
UnresolvedField,
UnsizedTemporary(Ty),
MissingFunctionDefinition(DefWithBodyId, ExprId),
- TypeMismatch(TypeMismatch),
+ TypeMismatch(TypeMismatch<'db>),
HasErrors,
/// This should never happen. Type mismatch should catch everything.
TypeError(&'static str),
@@ -128,7 +130,7 @@ struct DropScopeToken;
impl DropScopeToken {
fn pop_and_drop(
self,
- ctx: &mut MirLowerCtx<'_>,
+ ctx: &mut MirLowerCtx<'_, '_>,
current: BasicBlockId,
span: MirSpan,
) -> BasicBlockId {
@@ -140,7 +142,7 @@ impl DropScopeToken {
/// code. Either when the control flow is diverging (so drop code doesn't reached) or when drop is handled
/// for us (for example a block that ended with a return statement. Return will drop everything, so the block shouldn't
/// do anything)
- fn pop_assume_dropped(self, ctx: &mut MirLowerCtx<'_>) {
+ fn pop_assume_dropped(self, ctx: &mut MirLowerCtx<'_, '_>) {
std::mem::forget(self);
ctx.pop_drop_scope_assume_dropped_internal();
}
@@ -161,7 +163,7 @@ impl Drop for DropScopeToken {
// }
// }
-impl MirLowerError {
+impl MirLowerError<'_> {
pub fn pretty_print(
&self,
f: &mut String,
@@ -248,13 +250,13 @@ macro_rules! implementation_error {
}};
}
-impl From<LayoutError> for MirLowerError {
+impl From<LayoutError> for MirLowerError<'_> {
fn from(value: LayoutError) -> Self {
MirLowerError::LayoutError(value)
}
}
-impl MirLowerError {
+impl MirLowerError<'_> {
fn unresolved_path(
db: &dyn HirDatabase,
p: &Path,
@@ -267,14 +269,14 @@ impl MirLowerError {
}
}
-type Result<T> = std::result::Result<T, MirLowerError>;
+type Result<'db, T> = std::result::Result<T, MirLowerError<'db>>;
-impl<'ctx> MirLowerCtx<'ctx> {
+impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn new(
- db: &'ctx dyn HirDatabase,
+ db: &'db dyn HirDatabase,
owner: DefWithBodyId,
- body: &'ctx Body,
- infer: &'ctx InferenceResult,
+ body: &'a Body,
+ infer: &'a InferenceResult<'db>,
) -> Self {
let mut basic_blocks = Arena::new();
let start_block = basic_blocks.alloc(BasicBlock {
@@ -296,6 +298,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
};
let resolver = owner.resolver(db);
let env = db.trait_environment_for_body(owner);
+ let interner = DbInterner::new_with(db, Some(env.krate), env.block);
MirLowerCtx {
result: mir,
@@ -309,10 +312,11 @@ impl<'ctx> MirLowerCtx<'ctx> {
discr_temp: None,
drop_scopes: vec![DropScope::default()],
env,
+ interner,
}
}
- fn temp(&mut self, ty: Ty, current: BasicBlockId, span: MirSpan) -> Result<LocalId> {
+ fn temp(&mut self, ty: Ty, current: BasicBlockId, span: MirSpan) -> Result<'db, LocalId> {
if matches!(ty.kind(Interner), TyKind::Slice(_) | TyKind::Dyn(_)) {
return Err(MirLowerError::UnsizedTemporary(ty));
}
@@ -325,7 +329,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
&mut self,
expr_id: ExprId,
current: BasicBlockId,
- ) -> Result<Option<(Operand, BasicBlockId)>> {
+ ) -> Result<'db, Option<(Operand, BasicBlockId)>> {
if !self.has_adjustments(expr_id)
&& let Expr::Literal(l) = &self.body[expr_id]
{
@@ -343,8 +347,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
expr_id: ExprId,
place: Place,
current: BasicBlockId,
- adjustments: &[Adjustment],
- ) -> Result<Option<BasicBlockId>> {
+ adjustments: &[Adjustment<'db>],
+ ) -> Result<'db, Option<BasicBlockId>> {
match adjustments.split_last() {
Some((last, rest)) => match &last.kind {
Adjust::NeverToAny => {
@@ -372,7 +376,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
else {
return Ok(None);
};
- let bk = BorrowKind::from_chalk(*m);
+ let bk = BorrowKind::from_rustc(*m);
self.push_assignment(current, place, Rvalue::Ref(bk, p), expr_id.into());
Ok(Some(current))
}
@@ -388,7 +392,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
Rvalue::Cast(
CastKind::PointerCoercion(*cast),
Operand { kind: OperandKind::Copy(p), span: None },
- last.target.clone(),
+ last.target.to_chalk(self.interner),
),
expr_id.into(),
);
@@ -404,7 +408,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
expr_id: ExprId,
place: Place,
prev_block: BasicBlockId,
- ) -> Result<Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId>> {
if let Some(adjustments) = self.infer.expr_adjustments.get(&expr_id) {
return self.lower_expr_to_place_with_adjust(expr_id, place, prev_block, adjustments);
}
@@ -416,7 +420,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
expr_id: ExprId,
place: Place,
mut current: BasicBlockId,
- ) -> Result<Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId>> {
match &self.body[expr_id] {
Expr::OffsetOf(_) => {
not_supported!("builtin#offset_of")
@@ -443,7 +447,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
c.into(),
current,
place,
- subst,
+ subst.to_chalk(self.interner),
expr_id.into(),
self.expr_ty_without_adjust(expr_id),
)?;
@@ -511,12 +515,12 @@ impl<'ctx> MirLowerCtx<'ctx> {
ValueNs::EnumVariantId(variant_id) => {
let variant_fields = variant_id.fields(self.db);
if variant_fields.shape == FieldsShape::Unit {
- let ty = self.infer.type_of_expr[expr_id].clone();
+ let ty = self.infer.type_of_expr[expr_id];
current = self.lower_enum_variant(
variant_id,
current,
place,
- ty,
+ ty.to_chalk(self.interner),
Box::new([]),
expr_id.into(),
)?;
@@ -651,7 +655,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
if let Some((func_id, generic_args)) = self.infer.method_resolution(expr_id) {
let ty = chalk_ir::TyKind::FnDef(
CallableDefId::FunctionId(func_id).to_chalk(self.db),
- generic_args,
+ generic_args.to_chalk(self.interner),
)
.intern(Interner);
let func = Operand::from_bytes(Box::default(), ty);
@@ -710,7 +714,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
method_name.display(self.db, self.edition()).to_string(),
)
})?;
- let func = Operand::from_fn(self.db, func_id, generic_args);
+ let func = Operand::from_fn(self.db, func_id, generic_args.to_chalk(self.interner));
self.lower_call_and_args(
func,
iter::once(*receiver).chain(args.iter().copied()),
@@ -948,8 +952,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
let rvalue = if self.infer.coercion_casts.contains(expr) {
Rvalue::Use(it)
} else {
- let source_ty = self.infer[*expr].clone();
- let target_ty = self.infer[expr_id].clone();
+ let source_ty = self.infer[*expr].to_chalk(self.interner);
+ let target_ty = self.infer[expr_id].to_chalk(self.interner);
let cast_kind = if source_ty.as_reference().is_some() {
CastKind::PointerCoercion(PointerCast::ArrayToPointer)
} else {
@@ -1047,7 +1051,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
if !is_builtin
&& let Some((func_id, generic_args)) = self.infer.method_resolution(expr_id)
{
- let func = Operand::from_fn(self.db, func_id, generic_args);
+ let func =
+ Operand::from_fn(self.db, func_id, generic_args.to_chalk(self.interner));
return self.lower_call_and_args(
func,
[*lhs, *rhs].into_iter(),
@@ -1195,7 +1200,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
};
o.ok_or(MirLowerError::UnresolvedField)
})
- .collect::<Result<_>>()?,
+ .collect::<Result<'_, _>>()?,
),
expr_id.into(),
);
@@ -1207,7 +1212,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
not_supported!("closure with non closure type");
};
self.result.closures.push(*id);
- let (captures, _) = self.infer.closure_info(id);
+ let (captures, _) = self.infer.closure_info((*id).into());
let mut operands = vec![];
for capture in captures.iter() {
let p = Place {
@@ -1231,7 +1236,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
ProjectionElem::Subslice { from, to }
}
ProjectionElem::OpaqueCast(it) => {
- ProjectionElem::OpaqueCast(it)
+ ProjectionElem::OpaqueCast(it.to_chalk(self.interner))
}
#[allow(unreachable_patterns)]
ProjectionElem::Index(it) => match it {},
@@ -1241,9 +1246,12 @@ impl<'ctx> MirLowerCtx<'ctx> {
};
match &capture.kind {
CaptureKind::ByRef(bk) => {
- let placeholder_subst = self.placeholder_subst();
- let tmp_ty =
- capture.ty.clone().substitute(Interner, &placeholder_subst);
+ let placeholder_subst: crate::next_solver::GenericArgs<'db> =
+ self.placeholder_subst().to_nextsolver(self.interner);
+ let tmp_ty = capture
+ .ty
+ .instantiate(self.interner, placeholder_subst)
+ .to_chalk(self.interner);
// FIXME: Handle more than one span.
let capture_spans = capture.spans();
let tmp: Place = self.temp(tmp_ty, current, capture_spans[0])?.into();
@@ -1278,7 +1286,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
current = c;
Ok(Some(o))
})
- .collect::<Result<Option<_>>>()?
+ .collect::<Result<'_, Option<_>>>()?
else {
return Ok(None);
};
@@ -1309,7 +1317,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
current = c;
Ok(Some(o))
})
- .collect::<Result<Option<_>>>()?
+ .collect::<Result<'_, Option<_>>>()?
else {
return Ok(None);
};
@@ -1353,7 +1361,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
}
- fn push_field_projection(&mut self, place: &mut Place, expr_id: ExprId) -> Result<()> {
+ fn push_field_projection(&mut self, place: &mut Place, expr_id: ExprId) -> Result<'db, ()> {
if let Expr::Field { expr, name } = &self.body[expr_id] {
if let TyKind::Tuple(..) = self.expr_ty_after_adjustments(*expr).kind(Interner) {
let index =
@@ -1378,7 +1386,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
Ok(())
}
- fn lower_literal_or_const_to_operand(&mut self, ty: Ty, loc: &ExprId) -> Result<Operand> {
+ fn lower_literal_or_const_to_operand(&mut self, ty: Ty, loc: &ExprId) -> Result<'db, Operand> {
match &self.body[*loc] {
Expr::Literal(l) => self.lower_literal_to_operand(ty, l),
Expr::Path(c) => {
@@ -1415,7 +1423,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
}
- fn lower_literal_to_operand(&mut self, ty: Ty, l: &Literal) -> Result<Operand> {
+ fn lower_literal_to_operand(&mut self, ty: Ty, l: &Literal) -> Result<'db, Operand> {
let interner = DbInterner::new_with(self.db, None, None);
let size = || {
self.db
@@ -1479,7 +1487,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
subst: Substitution,
span: MirSpan,
ty: Ty,
- ) -> Result<()> {
+ ) -> Result<'db, ()> {
let c = self.lower_const_to_operand(subst, const_id, ty)?;
self.push_assignment(prev_block, place, c.into(), span);
Ok(())
@@ -1490,7 +1498,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
subst: Substitution,
const_id: GeneralConstId,
ty: Ty,
- ) -> Result<Operand> {
+ ) -> Result<'db, Operand> {
let c = if subst.len(Interner) != 0 {
// We can't evaluate constant with substitution now, as generics are not monomorphized in lowering.
intern_const_scalar(ConstScalar::UnevaluatedConst(const_id, subst), ty)
@@ -1510,7 +1518,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
cv: Box<[u8]>,
ty: Ty,
span: MirSpan,
- ) -> Result<()> {
+ ) -> Result<'db, ()> {
self.push_assignment(prev_block, place, Operand::from_bytes(cv, ty).into(), span);
Ok(())
}
@@ -1523,7 +1531,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
ty: Ty,
fields: Box<[Operand]>,
span: MirSpan,
- ) -> Result<BasicBlockId> {
+ ) -> Result<'db, BasicBlockId> {
let subst = match ty.kind(Interner) {
TyKind::Adt(_, subst) => subst.clone(),
_ => implementation_error!("Non ADT enum"),
@@ -1545,7 +1553,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
mut current: BasicBlockId,
is_uninhabited: bool,
span: MirSpan,
- ) -> Result<Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId>> {
let Some(args) = args
.map(|arg| {
if let Some((temp, c)) = self.lower_expr_to_some_operand(arg, current)? {
@@ -1555,7 +1563,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
Ok(None)
}
})
- .collect::<Result<Option<Vec<_>>>>()?
+ .collect::<Result<'_, Option<Vec<_>>>>()?
else {
return Ok(None);
};
@@ -1570,7 +1578,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
current: BasicBlockId,
is_uninhabited: bool,
span: MirSpan,
- ) -> Result<Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId>> {
let b = if is_uninhabited { None } else { Some(self.new_basic_block()) };
self.set_terminator(
current,
@@ -1600,7 +1608,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
fn expr_ty_without_adjust(&self, e: ExprId) -> Ty {
- self.infer[e].clone()
+ self.infer[e].to_chalk(self.interner)
}
fn expr_ty_after_adjustments(&self, e: ExprId) -> Ty {
@@ -1608,7 +1616,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
if let Some(it) = self.infer.expr_adjustments.get(&e)
&& let Some(it) = it.last()
{
- ty = Some(it.target.clone());
+ ty = Some(it.target.to_chalk(self.interner));
}
ty.unwrap_or_else(|| self.expr_ty_without_adjust(e))
}
@@ -1651,8 +1659,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
place: Place,
label: Option<LabelId>,
span: MirSpan,
- f: impl FnOnce(&mut MirLowerCtx<'_>, BasicBlockId) -> Result<()>,
- ) -> Result<Option<BasicBlockId>> {
+ f: impl FnOnce(&mut MirLowerCtx<'_, 'db>, BasicBlockId) -> Result<'db, ()>,
+ ) -> Result<'db, Option<BasicBlockId>> {
let begin = self.new_basic_block();
let prev = self.current_loop_blocks.replace(LoopBlocks {
begin,
@@ -1703,7 +1711,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
}
- fn current_loop_end(&mut self) -> Result<BasicBlockId> {
+ fn current_loop_end(&mut self) -> Result<'db, BasicBlockId> {
let r = match self
.current_loop_blocks
.as_mut()
@@ -1730,7 +1738,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
fn is_uninhabited(&self, expr_id: ExprId) -> bool {
is_ty_uninhabited_from(
self.db,
- &self.infer[expr_id],
+ &self.infer[expr_id].to_chalk(self.interner),
self.owner.module(self.db),
self.env.clone(),
)
@@ -1738,7 +1746,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
/// This function push `StorageLive` statement for the binding, and applies changes to add `StorageDead` and
/// `Drop` in the appropriated places.
- fn push_storage_live(&mut self, b: BindingId, current: BasicBlockId) -> Result<()> {
+ fn push_storage_live(&mut self, b: BindingId, current: BasicBlockId) -> Result<'db, ()> {
let l = self.binding_local(b)?;
self.push_storage_live_for_local(l, current, MirSpan::BindingId(b))
}
@@ -1748,13 +1756,13 @@ impl<'ctx> MirLowerCtx<'ctx> {
l: LocalId,
current: BasicBlockId,
span: MirSpan,
- ) -> Result<()> {
+ ) -> Result<'db, ()> {
self.drop_scopes.last_mut().unwrap().locals.push(l);
self.push_statement(current, StatementKind::StorageLive(l).with_span(span));
Ok(())
}
- fn resolve_lang_item(&self, item: LangItem) -> Result<LangItemTarget> {
+ fn resolve_lang_item(&self, item: LangItem) -> Result<'db, LangItemTarget> {
let crate_id = self.owner.module(self.db).krate();
lang_item(self.db, crate_id, item).ok_or(MirLowerError::LangItemNotFound(item))
}
@@ -1766,7 +1774,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
tail: Option<ExprId>,
place: Place,
span: MirSpan,
- ) -> Result<Option<Idx<BasicBlock>>> {
+ ) -> Result<'db, Option<Idx<BasicBlock>>> {
let scope = self.push_drop_scope();
for statement in statements.iter() {
match statement {
@@ -1842,7 +1850,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
params: impl Iterator<Item = (PatId, Ty)> + Clone,
self_binding: Option<(BindingId, Ty)>,
pick_binding: impl Fn(BindingId) -> bool,
- ) -> Result<BasicBlockId> {
+ ) -> Result<'db, BasicBlockId> {
let base_param_count = self.result.param_locals.len();
let self_binding = match self_binding {
Some((self_binding, ty)) => {
@@ -1873,9 +1881,10 @@ impl<'ctx> MirLowerCtx<'ctx> {
continue;
}
if !self.result.binding_locals.contains_idx(id) {
- self.result
- .binding_locals
- .insert(id, self.result.locals.alloc(Local { ty: self.infer[id].clone() }));
+ self.result.binding_locals.insert(
+ id,
+ self.result.locals.alloc(Local { ty: self.infer[id].to_chalk(self.interner) }),
+ );
}
}
let mut current = self.result.start_block;
@@ -1910,7 +1919,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
Ok(current)
}
- fn binding_local(&self, b: BindingId) -> Result<LocalId> {
+ fn binding_local(&self, b: BindingId) -> Result<'db, LocalId> {
match self.result.binding_locals.get(b) {
Some(it) => Ok(*it),
None => {
@@ -1922,7 +1931,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
}
- fn const_eval_discriminant(&self, variant: EnumVariantId) -> Result<i128> {
+ fn const_eval_discriminant(&self, variant: EnumVariantId) -> Result<'db, i128> {
let r = self.db.const_eval_discriminant(variant);
match r {
Ok(r) => Ok(r),
@@ -1993,7 +2002,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
&mut self,
mut current: BasicBlockId,
span: MirSpan,
- ) -> Result<BasicBlockId> {
+ ) -> Result<'db, BasicBlockId> {
current = self.pop_drop_scope_internal(current, span);
if !self.drop_scopes.is_empty() {
implementation_error!("Mismatched count between drop scope push and pops");
@@ -2021,9 +2030,14 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
}
-fn cast_kind(db: &dyn HirDatabase, source_ty: &Ty, target_ty: &Ty) -> Result<CastKind> {
- let from = CastTy::from_ty(db, source_ty);
- let cast = CastTy::from_ty(db, target_ty);
+fn cast_kind<'db>(
+ db: &'db dyn HirDatabase,
+ source_ty: &Ty,
+ target_ty: &Ty,
+) -> Result<'db, CastKind> {
+ let interner = DbInterner::new_with(db, None, None);
+ let from = CastTy::from_ty(db, source_ty.to_nextsolver(interner));
+ let cast = CastTy::from_ty(db, target_ty.to_nextsolver(interner));
Ok(match (from, cast) {
(Some(CastTy::Ptr(..) | CastTy::FnPtr), Some(CastTy::Int(_))) => {
CastKind::PointerExposeAddress
@@ -2039,31 +2053,34 @@ fn cast_kind(db: &dyn HirDatabase, source_ty: &Ty, target_ty: &Ty) -> Result<Cas
})
}
-pub fn mir_body_for_closure_query(
- db: &dyn HirDatabase,
+pub fn mir_body_for_closure_query<'db>(
+ db: &'db dyn HirDatabase,
closure: InternedClosureId,
-) -> Result<Arc<MirBody>> {
+) -> Result<'db, Arc<MirBody>> {
let InternedClosure(owner, expr) = db.lookup_intern_closure(closure);
let body = db.body(owner);
let infer = db.infer(owner);
let Expr::Closure { args, body: root, .. } = &body[expr] else {
implementation_error!("closure expression is not closure");
};
- let TyKind::Closure(_, substs) = &infer[expr].kind(Interner) else {
+ let crate::next_solver::TyKind::Closure(_, substs) = infer[expr].kind() else {
implementation_error!("closure expression is not closure");
};
- let (captures, kind) = infer.closure_info(&closure.into());
+ let (captures, kind) = infer.closure_info(closure);
let mut ctx = MirLowerCtx::new(db, owner, &body, &infer);
+ let substs: &Substitution = &substs.to_chalk(ctx.interner);
// 0 is return local
- ctx.result.locals.alloc(Local { ty: infer[*root].clone() });
+ ctx.result.locals.alloc(Local { ty: infer[*root].to_chalk(ctx.interner) });
let closure_local = ctx.result.locals.alloc(Local {
ty: match kind {
- FnTrait::FnOnce | FnTrait::AsyncFnOnce => infer[expr].clone(),
+ FnTrait::FnOnce | FnTrait::AsyncFnOnce => infer[expr].to_chalk(ctx.interner),
FnTrait::FnMut | FnTrait::AsyncFnMut => {
- TyKind::Ref(Mutability::Mut, error_lifetime(), infer[expr].clone()).intern(Interner)
+ TyKind::Ref(Mutability::Mut, error_lifetime(), infer[expr].to_chalk(ctx.interner))
+ .intern(Interner)
}
FnTrait::Fn | FnTrait::AsyncFn => {
- TyKind::Ref(Mutability::Not, error_lifetime(), infer[expr].clone()).intern(Interner)
+ TyKind::Ref(Mutability::Not, error_lifetime(), infer[expr].to_chalk(ctx.interner))
+ .intern(Interner)
}
},
});
@@ -2082,7 +2099,7 @@ pub fn mir_body_for_closure_query(
let current = ctx.pop_drop_scope_assert_finished(current, root.into())?;
ctx.set_terminator(current, TerminatorKind::Return, (*root).into());
}
- let mut upvar_map: FxHashMap<LocalId, Vec<(&CapturedItem, usize)>> = FxHashMap::default();
+ let mut upvar_map: FxHashMap<LocalId, Vec<(&CapturedItem<'_>, usize)>> = FxHashMap::default();
for (i, capture) in captures.iter().enumerate() {
let local = ctx.binding_local(capture.place.local)?;
upvar_map.entry(local).or_default().push((capture, i));
@@ -2144,7 +2161,10 @@ pub fn mir_body_for_closure_query(
Ok(Arc::new(ctx.result))
}
-pub fn mir_body_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Result<Arc<MirBody>> {
+pub fn mir_body_query<'db>(
+ db: &'db dyn HirDatabase,
+ def: DefWithBodyId,
+) -> Result<'db, Arc<MirBody>> {
let krate = def.krate(db);
let edition = krate.data(db).edition;
let detail = match def {
@@ -2177,22 +2197,22 @@ pub fn mir_body_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Result<Arc<Mi
Ok(Arc::new(result))
}
-pub(crate) fn mir_body_cycle_result(
- _db: &dyn HirDatabase,
+pub(crate) fn mir_body_cycle_result<'db>(
+ _db: &'db dyn HirDatabase,
_def: DefWithBodyId,
-) -> Result<Arc<MirBody>> {
+) -> Result<'db, Arc<MirBody>> {
Err(MirLowerError::Loop)
}
-pub fn lower_to_mir(
- db: &dyn HirDatabase,
+pub fn lower_to_mir<'db>(
+ db: &'db dyn HirDatabase,
owner: DefWithBodyId,
body: &Body,
- infer: &InferenceResult,
+ infer: &InferenceResult<'db>,
// FIXME: root_expr should always be the body.body_expr, but since `X` in `[(); X]` doesn't have its own specific body yet, we
// need to take this input explicitly.
root_expr: ExprId,
-) -> Result<MirBody> {
+) -> Result<'db, MirBody> {
if infer.type_mismatches().next().is_some() || infer.is_erroneous() {
return Err(MirLowerError::HasErrors);
}