Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/lower/as_place.rs')
-rw-r--r--crates/hir-ty/src/mir/lower/as_place.rs64
1 files changed, 31 insertions, 33 deletions
diff --git a/crates/hir-ty/src/mir/lower/as_place.rs b/crates/hir-ty/src/mir/lower/as_place.rs
index 2ed7aedecf..bb00a79480 100644
--- a/crates/hir-ty/src/mir/lower/as_place.rs
+++ b/crates/hir-ty/src/mir/lower/as_place.rs
@@ -14,15 +14,14 @@ impl<'db> MirLowerCtx<'_, 'db> {
&mut self,
expr_id: ExprId,
prev_block: BasicBlockId,
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
let ty = self.expr_ty_without_adjust(expr_id);
- let place = self.temp(ty, prev_block, expr_id.into())?;
- let Some(current) =
- self.lower_expr_to_place_without_adjust(expr_id, place.into(), prev_block)?
+ let place = self.temp(ty, prev_block, expr_id.into())?.into();
+ let Some(current) = self.lower_expr_to_place_without_adjust(expr_id, place, prev_block)?
else {
return Ok(None);
};
- Ok(Some((place.into(), current)))
+ Ok(Some((place, current)))
}
fn lower_expr_to_some_place_with_adjust(
@@ -30,18 +29,18 @@ impl<'db> MirLowerCtx<'_, 'db> {
expr_id: ExprId,
prev_block: BasicBlockId,
adjustments: &[Adjustment],
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
let ty = adjustments
.last()
.map(|it| it.target.as_ref())
.unwrap_or_else(|| self.expr_ty_without_adjust(expr_id));
- let place = self.temp(ty, prev_block, expr_id.into())?;
+ let place = self.temp(ty, prev_block, expr_id.into())?.into();
let Some(current) =
- self.lower_expr_to_place_with_adjust(expr_id, place.into(), prev_block, adjustments)?
+ self.lower_expr_to_place_with_adjust(expr_id, place, prev_block, adjustments)?
else {
return Ok(None);
};
- Ok(Some((place.into(), current)))
+ Ok(Some((place, current)))
}
pub(super) fn lower_expr_as_place_with_adjust(
@@ -50,7 +49,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
expr_id: ExprId,
upgrade_rvalue: bool,
adjustments: &[Adjustment],
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
let try_rvalue = |this: &mut MirLowerCtx<'_, 'db>| {
if !upgrade_rvalue {
return Err(MirLowerError::MutatingRvalue);
@@ -69,7 +68,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
else {
return Ok(None);
};
- it.0 = it.0.project(ProjectionElem::Deref, &mut self.result.projection_store);
+ it.0 = it.0.project(ProjectionElem::Deref);
Ok(Some(it))
}
Adjust::Deref(Some(od)) => {
@@ -108,7 +107,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
current: BasicBlockId,
expr_id: ExprId,
upgrade_rvalue: bool,
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
match self.infer.expr_adjustments.get(&expr_id) {
Some(a) => self.lower_expr_as_place_with_adjust(current, expr_id, upgrade_rvalue, a),
None => self.lower_expr_as_place_without_adjust(current, expr_id, upgrade_rvalue),
@@ -120,7 +119,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
current: BasicBlockId,
expr_id: ExprId,
upgrade_rvalue: bool,
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
let try_rvalue = |this: &mut MirLowerCtx<'_, 'db>| {
if !upgrade_rvalue {
return Err(MirLowerError::MutatingRvalue);
@@ -149,17 +148,14 @@ impl<'db> MirLowerCtx<'_, 'db> {
ty,
Mutability::Not,
);
- let temp: Place = self.temp(ref_ty, current, expr_id.into())?.into();
+ let temp = self.temp(ref_ty, current, expr_id.into())?.into();
self.push_assignment(
current,
temp,
Operand { kind: OperandKind::Static(s), span: None }.into(),
expr_id.into(),
);
- Ok(Some((
- temp.project(ProjectionElem::Deref, &mut self.result.projection_store),
- current,
- )))
+ Ok(Some((temp.project(ProjectionElem::Deref), current)))
}
_ => try_rvalue(self),
}
@@ -193,7 +189,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
let Some((mut r, current)) = self.lower_expr_as_place(current, *expr, true)? else {
return Ok(None);
};
- r = r.project(ProjectionElem::Deref, &mut self.result.projection_store);
+ r = r.project(ProjectionElem::Deref);
Ok(Some((r, current)))
}
Expr::UnaryOp { .. } => try_rvalue(self),
@@ -256,8 +252,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
else {
return Ok(None);
};
- p_base = p_base
- .project(ProjectionElem::Index(l_index), &mut self.result.projection_store);
+ p_base = p_base.project(ProjectionElem::Index(l_index));
Ok(Some((p_base, current)))
}
_ => try_rvalue(self),
@@ -267,20 +262,20 @@ impl<'db> MirLowerCtx<'_, 'db> {
fn lower_overloaded_index(
&mut self,
current: BasicBlockId,
- place: Place,
+ place: PlaceRef<'db>,
base_ty: Ty<'db>,
result_ty: Ty<'db>,
index_operand: Operand,
span: MirSpan,
index_fn: (FunctionId, GenericArgs<'db>),
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
let mutability = match base_ty.as_reference() {
Some((_, _, mutability)) => mutability,
None => Mutability::Not,
};
let result_ref =
Ty::new_ref(self.interner(), Region::error(self.interner()), result_ty, mutability);
- let mut result: Place = self.temp(result_ref, current, span)?.into();
+ let mut result = self.temp(result_ref, current, span)?.into();
let index_fn_op = Operand::const_zst(Ty::new_fn_def(
self.interner(),
CallableDefId::FunctionId(index_fn.0).into(),
@@ -288,7 +283,10 @@ impl<'db> MirLowerCtx<'_, 'db> {
));
let Some(current) = self.lower_call(
index_fn_op,
- Box::new([Operand { kind: OperandKind::Copy(place), span: None }, index_operand]),
+ Box::new([
+ Operand { kind: OperandKind::Copy(place.store()), span: None },
+ index_operand,
+ ]),
result,
current,
false,
@@ -297,19 +295,19 @@ impl<'db> MirLowerCtx<'_, 'db> {
else {
return Ok(None);
};
- result = result.project(ProjectionElem::Deref, &mut self.result.projection_store);
+ result = result.project(ProjectionElem::Deref);
Ok(Some((result, current)))
}
fn lower_overloaded_deref(
&mut self,
current: BasicBlockId,
- place: Place,
+ place: PlaceRef<'db>,
source_ty: Ty<'db>,
target_ty: Ty<'db>,
span: MirSpan,
mutability: bool,
- ) -> Result<'db, Option<(Place, BasicBlockId)>> {
+ ) -> Result<'db, Option<(PlaceRef<'db>, BasicBlockId)>> {
let lang_items = self.lang_items();
let (mutability, deref_fn, borrow_kind) = if !mutability {
(Mutability::Not, lang_items.Deref_deref, BorrowKind::Shared)
@@ -323,18 +321,18 @@ impl<'db> MirLowerCtx<'_, 'db> {
let error_region = Region::error(self.interner());
let ty_ref = Ty::new_ref(self.interner(), error_region, source_ty, mutability);
let target_ty_ref = Ty::new_ref(self.interner(), error_region, target_ty, mutability);
- let ref_place: Place = self.temp(ty_ref, current, span)?.into();
- self.push_assignment(current, ref_place, Rvalue::Ref(borrow_kind, place), span);
+ let ref_place = self.temp(ty_ref, current, span)?.into();
+ self.push_assignment(current, ref_place, Rvalue::Ref(borrow_kind, place.store()), span);
let deref_fn = deref_fn.ok_or(MirLowerError::LangItemNotFound)?;
let deref_fn_op = Operand::const_zst(Ty::new_fn_def(
self.interner(),
CallableDefId::FunctionId(deref_fn).into(),
GenericArgs::new_from_slice(&[source_ty.into()]),
));
- let mut result: Place = self.temp(target_ty_ref, current, span)?.into();
+ let mut result = self.temp(target_ty_ref, current, span)?.into();
let Some(current) = self.lower_call(
deref_fn_op,
- Box::new([Operand { kind: OperandKind::Copy(ref_place), span: None }]),
+ Box::new([Operand { kind: OperandKind::Copy(ref_place.store()), span: None }]),
result,
current,
false,
@@ -343,7 +341,7 @@ impl<'db> MirLowerCtx<'_, 'db> {
else {
return Ok(None);
};
- result = result.project(ProjectionElem::Deref, &mut self.result.projection_store);
+ result = result.project(ProjectionElem::Deref);
Ok(Some((result, current)))
}
}