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.rs141
1 files changed, 58 insertions, 83 deletions
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index c02c5ef876..99930798e8 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -69,6 +69,7 @@ struct MirLowerCtx<'a> {
drop_scopes: Vec<DropScope>,
}
+// FIXME: Make this smaller, its stored in database queries
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MirLowerError {
ConstEvalError(Box<str>, Box<ConstEvalError>),
@@ -258,7 +259,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
owner,
closures: vec![],
};
- let ctx = MirLowerCtx {
+
+ MirLowerCtx {
result: mir,
db,
infer,
@@ -268,8 +270,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
labeled_loop_blocks: Default::default(),
discr_temp: None,
drop_scopes: vec![DropScope::default()],
- };
- ctx
+ }
}
fn temp(&mut self, ty: Ty, current: BasicBlockId, span: MirSpan) -> Result<LocalId> {
@@ -287,12 +288,9 @@ impl<'ctx> MirLowerCtx<'ctx> {
current: BasicBlockId,
) -> Result<Option<(Operand, BasicBlockId)>> {
if !self.has_adjustments(expr_id) {
- match &self.body.exprs[expr_id] {
- Expr::Literal(l) => {
- let ty = self.expr_ty_without_adjust(expr_id);
- return Ok(Some((self.lower_literal_to_operand(ty, l)?, current)));
- }
- _ => (),
+ if let Expr::Literal(l) = &self.body.exprs[expr_id] {
+ let ty = self.expr_ty_without_adjust(expr_id);
+ return Ok(Some((self.lower_literal_to_operand(ty, l)?, current)));
}
}
let Some((p, current)) = self.lower_expr_as_place(current, expr_id, true)? else {
@@ -344,8 +342,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
current,
place,
Rvalue::Cast(
- CastKind::Pointer(cast.clone()),
- Operand::Copy(p).into(),
+ CastKind::Pointer(*cast),
+ Operand::Copy(p),
last.target.clone(),
),
expr_id.into(),
@@ -456,9 +454,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
Ok(Some(current))
}
ValueNs::EnumVariantId(variant_id) => {
- let variant_data =
- &self.db.enum_data(variant_id.parent).variants[variant_id.local_id];
- if variant_data.variant_data.kind() == StructKind::Unit {
+ let variant_data = &self.db.enum_variant_data(variant_id).variant_data;
+ if variant_data.kind() == StructKind::Unit {
let ty = self.infer.type_of_expr[expr_id].clone();
current = self.lower_enum_variant(
variant_id,
@@ -511,8 +508,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
return Ok(None);
};
let start_of_then = self.new_basic_block();
- let end_of_then =
- self.lower_expr_to_place(*then_branch, place.clone(), start_of_then)?;
+ let end_of_then = self.lower_expr_to_place(*then_branch, place, start_of_then)?;
let start_of_else = self.new_basic_block();
let end_of_else = if let Some(else_branch) = else_branch {
self.lower_expr_to_place(*else_branch, place, start_of_else)?
@@ -539,7 +535,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
self.pattern_match(current, None, cond_place, *pat)?;
self.write_bytes_to_place(
then_target,
- place.clone(),
+ place,
Box::new([1]),
TyBuilder::bool(),
MirSpan::Unknown,
@@ -560,25 +556,19 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
Expr::Block { id: _, statements, tail, label } => {
if let Some(label) = label {
- self.lower_loop(
- current,
- place.clone(),
- Some(*label),
- expr_id.into(),
- |this, begin| {
- if let Some(current) = this.lower_block_to_place(
- statements,
- begin,
- *tail,
- place,
- expr_id.into(),
- )? {
- let end = this.current_loop_end()?;
- this.set_goto(current, end, expr_id.into());
- }
- Ok(())
- },
- )
+ self.lower_loop(current, place, Some(*label), expr_id.into(), |this, begin| {
+ if let Some(current) = this.lower_block_to_place(
+ statements,
+ begin,
+ *tail,
+ place,
+ expr_id.into(),
+ )? {
+ let end = this.current_loop_end()?;
+ this.set_goto(current, end, expr_id.into());
+ }
+ Ok(())
+ })
} else {
self.lower_block_to_place(statements, current, *tail, place, expr_id.into())
}
@@ -646,9 +636,9 @@ impl<'ctx> MirLowerCtx<'ctx> {
);
}
TyKind::Error => {
- return Err(MirLowerError::MissingFunctionDefinition(self.owner, expr_id))
+ Err(MirLowerError::MissingFunctionDefinition(self.owner, expr_id))
}
- _ => return Err(MirLowerError::TypeError("function call on bad type")),
+ _ => Err(MirLowerError::TypeError("function call on bad type")),
}
}
Expr::MethodCall { receiver, args, method_name, .. } => {
@@ -678,7 +668,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
let mut end = None;
for MatchArm { pat, guard, expr } in arms.iter() {
let (then, mut otherwise) =
- self.pattern_match(current, None, cond_place.clone(), *pat)?;
+ self.pattern_match(current, None, cond_place, *pat)?;
let then = if let &Some(guard) = guard {
let next = self.new_basic_block();
let o = otherwise.get_or_insert_with(|| self.new_basic_block());
@@ -696,7 +686,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
} else {
then
};
- if let Some(block) = self.lower_expr_to_place(*expr, place.clone(), then)? {
+ if let Some(block) = self.lower_expr_to_place(*expr, place, then)? {
let r = end.get_or_insert_with(|| self.new_basic_block());
self.set_goto(block, *r, expr_id.into());
}
@@ -742,9 +732,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
.as_ref()
.ok_or(MirLowerError::BreakWithoutLoop)?,
};
- let Some(c) =
- self.lower_expr_to_place(expr, loop_data.place.clone(), current)?
- else {
+ let Some(c) = self.lower_expr_to_place(expr, loop_data.place, current)? else {
return Ok(None);
};
current = c;
@@ -906,7 +894,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
let ty = self.expr_ty_after_adjustments(*expr);
self.push_assignment(
current,
- place.clone(),
+ place,
Rvalue::ShallowInitBoxWithAlloc(ty),
expr_id.into(),
);
@@ -957,10 +945,11 @@ impl<'ctx> MirLowerCtx<'ctx> {
// for binary operator, and use without adjust to simplify our conditions.
let lhs_ty = self.expr_ty_without_adjust(*lhs);
let rhs_ty = self.expr_ty_without_adjust(*rhs);
- if matches!(op, BinaryOp::CmpOp(syntax::ast::CmpOp::Eq { .. })) {
- if lhs_ty.as_raw_ptr().is_some() && rhs_ty.as_raw_ptr().is_some() {
- break 'b true;
- }
+ if matches!(op, BinaryOp::CmpOp(syntax::ast::CmpOp::Eq { .. }))
+ && lhs_ty.as_raw_ptr().is_some()
+ && rhs_ty.as_raw_ptr().is_some()
+ {
+ break 'b true;
}
let builtin_inequal_impls = matches!(
op,
@@ -1006,11 +995,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
else {
return Ok(None);
};
- let r_value = Rvalue::CheckedBinaryOp(
- op.into(),
- Operand::Copy(lhs_place.clone()),
- rhs_op,
- );
+ let r_value =
+ Rvalue::CheckedBinaryOp(op.into(), Operand::Copy(lhs_place), rhs_op);
self.push_assignment(current, lhs_place, r_value, expr_id.into());
return Ok(Some(current));
} else {
@@ -1029,7 +1015,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
let start_of_then = self.new_basic_block();
self.push_assignment(
start_of_then,
- place.clone(),
+ place,
lhs_op.clone().into(),
expr_id.into(),
);
@@ -1168,12 +1154,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
let tmp_ty =
capture.ty.clone().substitute(Interner, &placeholder_subst);
let tmp: Place = self.temp(tmp_ty, current, capture.span)?.into();
- self.push_assignment(
- current,
- tmp.clone(),
- Rvalue::Ref(bk.clone(), p),
- capture.span,
- );
+ self.push_assignment(current, tmp, Rvalue::Ref(*bk, p), capture.span);
operands.push(Operand::Move(tmp));
}
CaptureKind::ByValue => operands.push(Operand::Move(p)),
@@ -1322,7 +1303,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
) {
let temp = self.temp(self.expr_ty_after_adjustments(rhs), current, rhs.into())?;
let temp = Place::from(temp);
- self.push_assignment(current, temp.clone(), rhs_op.into(), span);
+ self.push_assignment(current, temp, rhs_op.into(), span);
return self.lower_destructing_assignment(current, lhs, temp, span);
}
let Some((lhs_place, current)) = self.lower_expr_as_place(current, lhs, false)? else {
@@ -1333,11 +1314,10 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
fn placeholder_subst(&mut self) -> Substitution {
- let placeholder_subst = match self.owner.as_generic_def_id() {
+ match self.owner.as_generic_def_id() {
Some(it) => TyBuilder::placeholder_subst(self.db, it),
None => Substitution::empty(Interner),
- };
- placeholder_subst
+ }
}
fn push_field_projection(&mut self, place: &mut Place, expr_id: ExprId) -> Result<()> {
@@ -1470,7 +1450,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
} else {
let name = const_id.name(self.db.upcast());
self.db
- .const_eval(const_id.into(), subst, None)
+ .const_eval(const_id, subst, None)
.map_err(|e| MirLowerError::ConstEvalError(name.into(), Box::new(e)))?
};
Ok(Operand::Constant(c))
@@ -1612,13 +1592,13 @@ impl<'ctx> MirLowerCtx<'ctx> {
fn discr_temp_place(&mut self, current: BasicBlockId) -> Place {
match &self.discr_temp {
- Some(it) => it.clone(),
+ Some(it) => *it,
None => {
let tmp: Place = self
.temp(TyBuilder::discr_ty(), current, MirSpan::Unknown)
.expect("discr_ty is never unsized")
.into();
- self.discr_temp = Some(tmp.clone());
+ self.discr_temp = Some(tmp);
tmp
}
}
@@ -1874,11 +1854,13 @@ impl<'ctx> MirLowerCtx<'ctx> {
match r {
Ok(r) => Ok(r),
Err(e) => {
- let data = self.db.enum_data(variant.parent);
+ let db = self.db.upcast();
+ let loc = variant.lookup(db);
+ let enum_loc = loc.parent.lookup(db);
let name = format!(
"{}::{}",
- data.name.display(self.db.upcast()),
- data.variants[variant.local_id].name.display(self.db.upcast())
+ enum_loc.id.item_tree(db)[enum_loc.id.value].name.display(db.upcast()),
+ loc.id.item_tree(db)[loc.id.value].name.display(db.upcast()),
);
Err(MirLowerError::ConstEvalError(name.into(), Box::new(e)))
}
@@ -2039,19 +2021,16 @@ pub fn mir_body_for_closure_query(
ctx.result.walk_places(|p, store| {
if let Some(it) = upvar_map.get(&p.local) {
let r = it.iter().find(|it| {
- if p.projection.lookup(&store).len() < it.0.place.projections.len() {
+ if p.projection.lookup(store).len() < it.0.place.projections.len() {
return false;
}
- for (it, y) in p.projection.lookup(&store).iter().zip(it.0.place.projections.iter())
+ for (it, y) in p.projection.lookup(store).iter().zip(it.0.place.projections.iter())
{
match (it, y) {
(ProjectionElem::Deref, ProjectionElem::Deref) => (),
(ProjectionElem::Field(it), ProjectionElem::Field(y)) if it == y => (),
(ProjectionElem::ClosureField(it), ProjectionElem::ClosureField(y))
- if it == y =>
- {
- ()
- }
+ if it == y => {}
_ => return false,
}
}
@@ -2067,15 +2046,11 @@ pub fn mir_body_for_closure_query(
next_projs.push(ProjectionElem::Deref);
}
next_projs.extend(
- prev_projs
- .lookup(&store)
- .iter()
- .skip(it.0.place.projections.len())
- .cloned(),
+ prev_projs.lookup(store).iter().skip(it.0.place.projections.len()).cloned(),
);
p.projection = store.intern(next_projs.into());
}
- None => err = Some(p.clone()),
+ None => err = Some(*p),
}
}
});
@@ -2104,7 +2079,7 @@ pub fn mir_body_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Result<Arc<Mi
.display(db.upcast())
.to_string(),
DefWithBodyId::VariantId(it) => {
- db.enum_data(it.parent).variants[it.local_id].name.display(db.upcast()).to_string()
+ db.enum_variant_data(it).name.display(db.upcast()).to_string()
}
DefWithBodyId::InTypeConstId(it) => format!("in type const {it:?}"),
});