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.rs75
1 files changed, 47 insertions, 28 deletions
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index 557027756f..7b48b15d9e 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -13,7 +13,7 @@ use hir_def::{
Pat, PatId, RecordFieldPat, RecordLitField,
},
item_tree::FieldsShape,
- lang_item::{LangItem, LangItemTarget},
+ lang_item::{LangItem, LangItemTarget, lang_item},
resolver::{HasResolver, ResolveValueResult, Resolver, ValueNs},
};
use hir_expand::name::Name;
@@ -48,6 +48,8 @@ use crate::{
utils::ClosureSubst,
};
+use super::OperandKind;
+
mod as_place;
mod pattern_matching;
@@ -324,7 +326,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
let Some((p, current)) = self.lower_expr_as_place(current, expr_id, true)? else {
return Ok(None);
};
- Ok(Some((Operand::Copy(p), current)))
+ Ok(Some((Operand { kind: OperandKind::Copy(p), span: Some(expr_id.into()) }, current)))
}
fn lower_expr_to_place_with_adjust(
@@ -347,7 +349,12 @@ impl<'ctx> MirLowerCtx<'ctx> {
else {
return Ok(None);
};
- self.push_assignment(current, place, Operand::Copy(p).into(), expr_id.into());
+ self.push_assignment(
+ current,
+ place,
+ Operand { kind: OperandKind::Copy(p), span: None }.into(),
+ expr_id.into(),
+ );
Ok(Some(current))
}
Adjust::Borrow(AutoBorrow::Ref(_, m) | AutoBorrow::RawPtr(m)) => {
@@ -371,7 +378,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
place,
Rvalue::Cast(
CastKind::PointerCoercion(*cast),
- Operand::Copy(p),
+ Operand { kind: OperandKind::Copy(p), span: None },
last.target.clone(),
),
expr_id.into(),
@@ -476,7 +483,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
self.push_assignment(
current,
place,
- Operand::Copy(temp).into(),
+ Operand { kind: OperandKind::Copy(temp), span: None }.into(),
expr_id.into(),
);
Ok(Some(current))
@@ -517,21 +524,23 @@ impl<'ctx> MirLowerCtx<'ctx> {
self.push_assignment(
current,
place,
- Operand::Constant(
- ConstData {
- ty,
- value: chalk_ir::ConstValue::BoundVar(BoundVar::new(
- DebruijnIndex::INNERMOST,
- generics.type_or_const_param_idx(p.into()).ok_or(
- MirLowerError::TypeError(
- "fail to lower const generic param",
- ),
- )?,
- )),
- }
- .intern(Interner),
- )
- .into(),
+ Rvalue::from(Operand {
+ kind: OperandKind::Constant(
+ ConstData {
+ ty,
+ value: chalk_ir::ConstValue::BoundVar(BoundVar::new(
+ DebruijnIndex::INNERMOST,
+ generics.type_or_const_param_idx(p.into()).ok_or(
+ MirLowerError::TypeError(
+ "fail to lower const generic param",
+ ),
+ )?,
+ )),
+ }
+ .intern(Interner),
+ ),
+ span: None,
+ }),
expr_id.into(),
);
Ok(Some(current))
@@ -876,7 +885,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
})),
&mut self.result.projection_store,
);
- Operand::Copy(p)
+ Operand { kind: OperandKind::Copy(p), span: None }
}
})
.collect(),
@@ -979,7 +988,12 @@ impl<'ctx> MirLowerCtx<'ctx> {
else {
return Ok(None);
};
- self.push_assignment(current, place, Operand::Copy(p).into(), expr_id.into());
+ self.push_assignment(
+ current,
+ place,
+ Operand { kind: OperandKind::Copy(p), span: None }.into(),
+ expr_id.into(),
+ );
Ok(Some(current))
}
Expr::UnaryOp {
@@ -1056,8 +1070,11 @@ impl<'ctx> MirLowerCtx<'ctx> {
else {
return Ok(None);
};
- let r_value =
- Rvalue::CheckedBinaryOp(op.into(), Operand::Copy(lhs_place), rhs_op);
+ let r_value = Rvalue::CheckedBinaryOp(
+ op.into(),
+ Operand { kind: OperandKind::Copy(lhs_place), span: None },
+ rhs_op,
+ );
self.push_assignment(current, lhs_place, r_value, expr_id.into());
return Ok(Some(current));
}
@@ -1232,9 +1249,11 @@ impl<'ctx> MirLowerCtx<'ctx> {
Rvalue::Ref(*bk, p),
capture_spans[0],
);
- operands.push(Operand::Move(tmp));
+ operands.push(Operand { kind: OperandKind::Move(tmp), span: None });
+ }
+ CaptureKind::ByValue => {
+ operands.push(Operand { kind: OperandKind::Move(p), span: None })
}
- CaptureKind::ByValue => operands.push(Operand::Move(p)),
}
}
self.push_assignment(
@@ -1476,7 +1495,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
.const_eval(const_id, subst, None)
.map_err(|e| MirLowerError::ConstEvalError(name.into(), Box::new(e)))?
};
- Ok(Operand::Constant(c))
+ Ok(Operand { kind: OperandKind::Constant(c), span: None })
}
fn write_bytes_to_place(
@@ -1727,7 +1746,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
fn resolve_lang_item(&self, item: LangItem) -> Result<LangItemTarget> {
let crate_id = self.owner.module(self.db).krate();
- self.db.lang_item(crate_id, item).ok_or(MirLowerError::LangItemNotFound(item))
+ lang_item(self.db, crate_id, item).ok_or(MirLowerError::LangItemNotFound(item))
}
fn lower_block_to_place(