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.rs543
1 files changed, 285 insertions, 258 deletions
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index ec7bff7082..92f9cd4261 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -3,10 +3,9 @@
use std::{fmt::Write, iter, mem};
use base_db::Crate;
-use chalk_ir::{BoundVar, ConstData, DebruijnIndex, TyKind};
use hir_def::{
- AdtId, DefWithBodyId, EnumVariantId, GeneralConstId, HasModule, ItemContainerId, LocalFieldId,
- Lookup, TraitId, TupleId, TypeOrConstParamId,
+ AdtId, DefWithBodyId, EnumVariantId, GeneralConstId, GenericParamId, HasModule,
+ ItemContainerId, LocalFieldId, Lookup, TraitId, TupleId,
expr_store::{Body, ExpressionStore, HygieneId, path::Path},
hir::{
ArithOp, Array, BinaryOp, BindingAnnotation, BindingId, ExprId, LabelId, Literal, MatchArm,
@@ -20,37 +19,33 @@ use hir_expand::name::Name;
use la_arena::ArenaMap;
use rustc_apfloat::Float;
use rustc_hash::FxHashMap;
-use rustc_type_ir::inherent::IntoKind;
+use rustc_type_ir::inherent::{Const as _, IntoKind, SliceLike, Ty as _};
use span::{Edition, FileId};
use syntax::TextRange;
use triomphe::Arc;
use crate::{
- Adjust, Adjustment, AutoBorrow, CallableDefId, TraitEnvironment, TyBuilder, TyExt,
+ Adjust, Adjustment, AutoBorrow, CallableDefId, TraitEnvironment,
consteval::ConstEvalError,
db::{HirDatabase, InternedClosure, InternedClosureId},
display::{DisplayTarget, HirDisplay, hir_display_with_store},
- error_lifetime,
generics::generics,
infer::{CaptureKind, CapturedItem, TypeMismatch, cast::CastTy},
inhabitedness::is_ty_uninhabited_from,
layout::LayoutError,
- mapping::ToChalk,
mir::{
- AggregateKind, Arena, BasicBlock, BasicBlockId, BinOp, BorrowKind, CastKind, ConstScalar,
- Either, Expr, FieldId, Idx, InferenceResult, Interner, Local, LocalId, MemoryMap, MirBody,
- MirSpan, Mutability, Operand, Place, PlaceElem, PointerCast, ProjectionElem,
- ProjectionStore, RawIdx, Rvalue, Statement, StatementKind, Substitution, SwitchTargets,
- Terminator, TerminatorKind, TupleFieldId, Ty, UnOp, VariantId, intern_const_scalar,
- return_slot,
+ AggregateKind, Arena, BasicBlock, BasicBlockId, BinOp, BorrowKind, CastKind, Either, Expr,
+ FieldId, GenericArgs, Idx, InferenceResult, Local, LocalId, MemoryMap, MirBody, MirSpan,
+ Mutability, Operand, Place, PlaceElem, PointerCast, ProjectionElem, ProjectionStore,
+ RawIdx, Rvalue, Statement, StatementKind, SwitchTargets, Terminator, TerminatorKind,
+ TupleFieldId, Ty, UnOp, VariantId, return_slot,
},
next_solver::{
- DbInterner,
- mapping::{ChalkToNextSolver, NextSolverToChalk},
+ Const, DbInterner, ParamConst, Region, TyKind, TypingMode, UnevaluatedConst,
+ infer::{DbInternerInferExt, InferCtxt},
+ mapping::NextSolverToChalk,
},
- static_lifetime,
traits::FnTrait,
- utils::ClosureSubst,
};
use super::OperandKind;
@@ -61,33 +56,33 @@ mod pattern_matching;
mod tests;
#[derive(Debug, Clone)]
-struct LoopBlocks {
- begin: BasicBlockId,
+struct LoopBlocks<'db> {
+ begin: BasicBlockId<'db>,
/// `None` for loops that are not terminating
- end: Option<BasicBlockId>,
- place: Place,
+ end: Option<BasicBlockId<'db>>,
+ place: Place<'db>,
drop_scope_index: usize,
}
#[derive(Debug, Clone, Default)]
-struct DropScope {
+struct DropScope<'db> {
/// locals, in order of definition (so we should run drop glues in reverse order)
- locals: Vec<LocalId>,
+ locals: Vec<LocalId<'db>>,
}
struct MirLowerCtx<'a, 'db> {
- result: MirBody,
+ result: MirBody<'db>,
owner: DefWithBodyId,
- current_loop_blocks: Option<LoopBlocks>,
- labeled_loop_blocks: FxHashMap<LabelId, LoopBlocks>,
- discr_temp: Option<Place>,
+ current_loop_blocks: Option<LoopBlocks<'db>>,
+ labeled_loop_blocks: FxHashMap<LabelId, LoopBlocks<'db>>,
+ discr_temp: Option<Place<'db>>,
db: &'db dyn HirDatabase,
body: &'a Body,
infer: &'a InferenceResult<'db>,
resolver: Resolver<'db>,
- drop_scopes: Vec<DropScope>,
+ drop_scopes: Vec<DropScope<'db>>,
env: Arc<TraitEnvironment<'db>>,
- interner: DbInterner<'db>,
+ infcx: InferCtxt<'db>,
}
// FIXME: Make this smaller, its stored in database queries
@@ -103,7 +98,7 @@ pub enum MirLowerError<'db> {
RecordLiteralWithoutPath,
UnresolvedMethod(String),
UnresolvedField,
- UnsizedTemporary(Ty),
+ UnsizedTemporary(Ty<'db>),
MissingFunctionDefinition(DefWithBodyId, ExprId),
TypeMismatch(TypeMismatch<'db>),
HasErrors,
@@ -118,22 +113,22 @@ pub enum MirLowerError<'db> {
LangItemNotFound(LangItem),
MutatingRvalue,
UnresolvedLabel,
- UnresolvedUpvar(Place),
+ UnresolvedUpvar(Place<'db>),
InaccessibleLocal,
// monomorphization errors:
- GenericArgNotProvided(TypeOrConstParamId, Substitution),
+ GenericArgNotProvided(GenericParamId, GenericArgs<'db>),
}
/// A token to ensuring that each drop scope is popped at most once, thanks to the compiler that checks moves.
struct DropScopeToken;
impl DropScopeToken {
- fn pop_and_drop(
+ fn pop_and_drop<'db>(
self,
- ctx: &mut MirLowerCtx<'_, '_>,
- current: BasicBlockId,
+ ctx: &mut MirLowerCtx<'_, 'db>,
+ current: BasicBlockId<'db>,
span: MirSpan,
- ) -> BasicBlockId {
+ ) -> BasicBlockId<'db> {
std::mem::forget(self);
ctx.pop_drop_scope_internal(current, span)
}
@@ -199,15 +194,24 @@ impl MirLowerError<'_> {
e.actual.display(db, display_target),
)?,
MirLowerError::GenericArgNotProvided(id, subst) => {
- let parent = id.parent;
- let param = &db.generic_params(parent)[id.local_id];
+ let param_name = match *id {
+ GenericParamId::TypeParamId(id) => {
+ db.generic_params(id.parent())[id.local_id()].name().cloned()
+ }
+ GenericParamId::ConstParamId(id) => {
+ db.generic_params(id.parent())[id.local_id()].name().cloned()
+ }
+ GenericParamId::LifetimeParamId(id) => {
+ Some(db.generic_params(id.parent)[id.local_id].name.clone())
+ }
+ };
writeln!(
f,
"Generic arg not provided for {}",
- param.name().unwrap_or(&Name::missing()).display(db, display_target.edition)
+ param_name.unwrap_or(Name::missing()).display(db, display_target.edition)
)?;
writeln!(f, "Provided args: [")?;
- for g in subst.iter(Interner) {
+ for g in subst.iter() {
write!(f, " {},", g.display(db, display_target))?;
}
writeln!(f, "]")?;
@@ -285,7 +289,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
is_cleanup: false,
});
let locals = Arena::new();
- let binding_locals: ArenaMap<BindingId, LocalId> = ArenaMap::new();
+ let binding_locals: ArenaMap<BindingId, LocalId<'db>> = ArenaMap::new();
let mir = MirBody {
projection_store: ProjectionStore::default(),
basic_blocks,
@@ -299,6 +303,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
let resolver = owner.resolver(db);
let env = db.trait_environment_for_body(owner);
let interner = DbInterner::new_with(db, Some(env.krate), env.block);
+ let infcx = interner.infer_ctxt().build(TypingMode::non_body_analysis());
MirLowerCtx {
result: mir,
@@ -312,12 +317,22 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
discr_temp: None,
drop_scopes: vec![DropScope::default()],
env,
- interner,
+ infcx,
}
}
- fn temp(&mut self, ty: Ty, current: BasicBlockId, span: MirSpan) -> Result<'db, LocalId> {
- if matches!(ty.kind(Interner), TyKind::Slice(_) | TyKind::Dyn(_)) {
+ #[inline]
+ fn interner(&self) -> DbInterner<'db> {
+ self.infcx.interner
+ }
+
+ fn temp(
+ &mut self,
+ ty: Ty<'db>,
+ current: BasicBlockId<'db>,
+ span: MirSpan,
+ ) -> Result<'db, LocalId<'db>> {
+ if matches!(ty.kind(), TyKind::Slice(_) | TyKind::Dynamic(..)) {
return Err(MirLowerError::UnsizedTemporary(ty));
}
let l = self.result.locals.alloc(Local { ty });
@@ -328,8 +343,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_expr_to_some_operand(
&mut self,
expr_id: ExprId,
- current: BasicBlockId,
- ) -> Result<'db, Option<(Operand, BasicBlockId)>> {
+ current: BasicBlockId<'db>,
+ ) -> Result<'db, Option<(Operand<'db>, BasicBlockId<'db>)>> {
if !self.has_adjustments(expr_id)
&& let Expr::Literal(l) = &self.body[expr_id]
{
@@ -345,15 +360,18 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_expr_to_place_with_adjust(
&mut self,
expr_id: ExprId,
- place: Place,
- current: BasicBlockId,
+ place: Place<'db>,
+ current: BasicBlockId<'db>,
adjustments: &[Adjustment<'db>],
- ) -> Result<'db, Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId<'db>>> {
match adjustments.split_last() {
Some((last, rest)) => match &last.kind {
Adjust::NeverToAny => {
- let temp =
- self.temp(TyKind::Never.intern(Interner), current, MirSpan::Unknown)?;
+ let temp = self.temp(
+ Ty::new(self.interner(), TyKind::Never),
+ current,
+ MirSpan::Unknown,
+ )?;
self.lower_expr_to_place_with_adjust(expr_id, temp.into(), current, rest)
}
Adjust::Deref(_) => {
@@ -392,7 +410,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
Rvalue::Cast(
CastKind::PointerCoercion(*cast),
Operand { kind: OperandKind::Copy(p), span: None },
- last.target.to_chalk(self.interner),
+ last.target,
),
expr_id.into(),
);
@@ -406,9 +424,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_expr_to_place(
&mut self,
expr_id: ExprId,
- place: Place,
- prev_block: BasicBlockId,
- ) -> Result<'db, Option<BasicBlockId>> {
+ place: Place<'db>,
+ prev_block: BasicBlockId<'db>,
+ ) -> Result<'db, Option<BasicBlockId<'db>>> {
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);
}
@@ -418,9 +436,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_expr_to_place_without_adjust(
&mut self,
expr_id: ExprId,
- place: Place,
- mut current: BasicBlockId,
- ) -> Result<'db, Option<BasicBlockId>> {
+ place: Place<'db>,
+ mut current: BasicBlockId<'db>,
+ ) -> Result<'db, Option<BasicBlockId<'db>>> {
match &self.body[expr_id] {
Expr::OffsetOf(_) => {
not_supported!("builtin#offset_of")
@@ -443,14 +461,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
if let Some((assoc, subst)) = self.infer.assoc_resolutions_for_expr(expr_id) {
match assoc {
hir_def::AssocItemId::ConstId(c) => {
- self.lower_const(
- c.into(),
- current,
- place,
- subst.to_chalk(self.interner),
- expr_id.into(),
- self.expr_ty_without_adjust(expr_id),
- )?;
+ self.lower_const(c.into(), current, place, subst, expr_id.into())?;
return Ok(Some(current));
}
hir_def::AssocItemId::FunctionId(_) => {
@@ -506,9 +517,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
const_id.into(),
current,
place,
- Substitution::empty(Interner),
+ GenericArgs::new_from_iter(self.interner(), []),
expr_id.into(),
- self.expr_ty_without_adjust(expr_id),
)?;
Ok(Some(current))
}
@@ -520,7 +530,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
variant_id,
current,
place,
- ty.to_chalk(self.interner),
+ ty,
Box::new([]),
expr_id.into(),
)?;
@@ -533,25 +543,21 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
not_supported!("owner without generic def id");
};
let generics = generics(self.db, def);
- let ty = self.expr_ty_without_adjust(expr_id);
+ let index = generics
+ .type_or_const_param_idx(p.into())
+ .ok_or(MirLowerError::TypeError("fail to lower const generic param"))?
+ as u32;
self.push_assignment(
current,
place,
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),
- ),
+ kind: OperandKind::Constant {
+ konst: Const::new_param(
+ self.interner(),
+ ParamConst { id: p, index },
+ ),
+ ty: self.db.const_param_ty_ns(p),
+ },
span: None,
}),
expr_id.into(),
@@ -603,7 +609,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
then_target,
place,
Box::new([1]),
- TyBuilder::bool(),
+ Ty::new_bool(self.interner()),
MirSpan::Unknown,
)?;
if let Some(else_target) = else_target {
@@ -611,7 +617,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
else_target,
place,
Box::new([0]),
- TyBuilder::bool(),
+ Ty::new_bool(self.interner()),
MirSpan::Unknown,
)?;
}
@@ -653,11 +659,11 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
}
Expr::Call { callee, args, .. } => {
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.to_chalk(self.interner),
- )
- .intern(Interner);
+ let ty = Ty::new_fn_def(
+ self.interner(),
+ CallableDefId::FunctionId(func_id).into(),
+ generic_args,
+ );
let func = Operand::from_bytes(Box::default(), ty);
return self.lower_call_and_args(
func,
@@ -669,9 +675,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
);
}
let callee_ty = self.expr_ty_after_adjustments(*callee);
- match &callee_ty.kind(Interner) {
- chalk_ir::TyKind::FnDef(..) => {
- let func = Operand::from_bytes(Box::default(), callee_ty.clone());
+ match callee_ty.kind() {
+ TyKind::FnDef(..) => {
+ let func = Operand::from_bytes(Box::default(), callee_ty);
self.lower_call_and_args(
func,
args.iter().copied(),
@@ -681,7 +687,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
expr_id.into(),
)
}
- chalk_ir::TyKind::Function(_) => {
+ TyKind::FnPtr(..) => {
let Some((func, current)) =
self.lower_expr_to_some_operand(*callee, current)?
else {
@@ -701,7 +707,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
"method resolution not emitted for closure (Are Fn traits available?)"
);
}
- TyKind::Error => {
+ TyKind::Error(_) => {
Err(MirLowerError::MissingFunctionDefinition(self.owner, expr_id))
}
_ => Err(MirLowerError::TypeError("function call on bad type")),
@@ -714,7 +720,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
method_name.display(self.db, self.edition()).to_string(),
)
})?;
- let func = Operand::from_fn(self.db, func_id, generic_args.to_chalk(self.interner));
+ let func = Operand::from_fn(self.db, func_id, generic_args);
self.lower_call_and_args(
func,
iter::once(*receiver).chain(args.iter().copied()),
@@ -862,8 +868,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
),
None => MirLowerError::RecordLiteralWithoutPath,
})?;
- let subst = match self.expr_ty_without_adjust(expr_id).kind(Interner) {
- TyKind::Adt(_, s) => s.clone(),
+ let subst = match self.expr_ty_without_adjust(expr_id).kind() {
+ TyKind::Adt(_, s) => s,
_ => not_supported!("Non ADT record literal"),
};
let variant_fields = variant_id.fields(self.db);
@@ -952,12 +958,12 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
let rvalue = if self.infer.coercion_casts.contains(expr) {
Rvalue::Use(it)
} else {
- let source_ty = self.infer[*expr].to_chalk(self.interner);
- let target_ty = self.infer[expr_id].to_chalk(self.interner);
+ let source_ty = self.infer[*expr];
+ let target_ty = self.infer[expr_id];
let cast_kind = if source_ty.as_reference().is_some() {
CastKind::PointerCoercion(PointerCast::ArrayToPointer)
} else {
- cast_kind(self.db, &source_ty, &target_ty)?
+ cast_kind(self.db, source_ty, target_ty)?
};
Rvalue::Cast(cast_kind, it, target_ty)
@@ -1034,8 +1040,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
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 { .. }))
- && lhs_ty.as_raw_ptr().is_some()
- && rhs_ty.as_raw_ptr().is_some()
+ && matches!(lhs_ty.kind(), TyKind::RawPtr(..))
+ && matches!(rhs_ty.kind(), TyKind::RawPtr(..))
{
break 'b true;
}
@@ -1044,15 +1050,26 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
BinaryOp::ArithOp(ArithOp::Shl | ArithOp::Shr)
| BinaryOp::Assignment { op: Some(ArithOp::Shl | ArithOp::Shr) }
);
- lhs_ty.is_scalar()
- && rhs_ty.is_scalar()
- && (lhs_ty == rhs_ty || builtin_inequal_impls)
+ matches!(
+ lhs_ty.kind(),
+ TyKind::Bool
+ | TyKind::Char
+ | TyKind::Int(_)
+ | TyKind::Uint(_)
+ | TyKind::Float(_)
+ ) && matches!(
+ rhs_ty.kind(),
+ TyKind::Bool
+ | TyKind::Char
+ | TyKind::Int(_)
+ | TyKind::Uint(_)
+ | TyKind::Float(_)
+ ) && (lhs_ty == rhs_ty || builtin_inequal_impls)
};
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.to_chalk(self.interner));
+ let func = Operand::from_fn(self.db, func_id, generic_args);
return self.lower_call_and_args(
func,
[*lhs, *rhs].into_iter(),
@@ -1185,7 +1202,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
current,
place,
Rvalue::Aggregate(
- AggregateKind::Adt(st.into(), subst.clone()),
+ AggregateKind::Adt(st.into(), subst),
st.fields(self.db)
.fields()
.iter()
@@ -1193,9 +1210,10 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
let o = match it.1.name.as_str() {
"start" => lp.take(),
"end" => rp.take(),
- "exhausted" => {
- Some(Operand::from_bytes(Box::new([0]), TyBuilder::bool()))
- }
+ "exhausted" => Some(Operand::from_bytes(
+ Box::new([0]),
+ Ty::new_bool(self.interner()),
+ )),
_ => None,
};
o.ok_or(MirLowerError::UnresolvedField)
@@ -1208,11 +1226,11 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
}
Expr::Closure { .. } => {
let ty = self.expr_ty_without_adjust(expr_id);
- let TyKind::Closure(id, _) = ty.kind(Interner) else {
+ let TyKind::Closure(id, _) = ty.kind() else {
not_supported!("closure with non closure type");
};
- self.result.closures.push(*id);
- let (captures, _) = self.infer.closure_info((*id).into());
+ self.result.closures.push(id.0);
+ let (captures, _) = self.infer.closure_info(id.0);
let mut operands = vec![];
for capture in captures.iter() {
let p = Place {
@@ -1236,7 +1254,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
ProjectionElem::Subslice { from, to }
}
ProjectionElem::OpaqueCast(it) => {
- ProjectionElem::OpaqueCast(it.to_chalk(self.interner))
+ ProjectionElem::OpaqueCast(it)
}
#[allow(unreachable_patterns)]
ProjectionElem::Index(it) => match it {},
@@ -1246,15 +1264,11 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
};
match &capture.kind {
CaptureKind::ByRef(bk) => {
- 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);
+ let tmp_ty = capture.ty.instantiate_identity();
// FIXME: Handle more than one span.
let capture_spans = capture.spans();
- let tmp: Place = self.temp(tmp_ty, current, capture_spans[0])?.into();
+ let tmp: Place<'db> =
+ self.temp(tmp_ty, current, capture_spans[0])?.into();
self.push_assignment(
current,
tmp,
@@ -1299,8 +1313,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
}
Expr::Array(l) => match l {
Array::ElementList { elements, .. } => {
- let elem_ty = match &self.expr_ty_without_adjust(expr_id).kind(Interner) {
- TyKind::Array(ty, _) => ty.clone(),
+ let elem_ty = match self.expr_ty_without_adjust(expr_id).kind() {
+ TyKind::Array(ty, _) => ty,
_ => {
return Err(MirLowerError::TypeError(
"Array expression with non array type",
@@ -1331,8 +1345,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
else {
return Ok(None);
};
- let len = match &self.expr_ty_without_adjust(expr_id).kind(Interner) {
- TyKind::Array(_, len) => len.clone(),
+ let len = match self.expr_ty_without_adjust(expr_id).kind() {
+ TyKind::Array(_, len) => len,
_ => {
return Err(MirLowerError::TypeError(
"Array repeat expression with non array type",
@@ -1354,16 +1368,13 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
}
}
- fn placeholder_subst(&mut self) -> Substitution {
- match self.owner.as_generic_def_id(self.db) {
- Some(it) => TyBuilder::placeholder_subst(self.db, it),
- None => Substitution::empty(Interner),
- }
- }
-
- fn push_field_projection(&mut self, place: &mut Place, expr_id: ExprId) -> Result<'db, ()> {
+ fn push_field_projection(
+ &mut self,
+ place: &mut Place<'db>,
+ 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) {
+ if let TyKind::Tuple(..) = self.expr_ty_after_adjustments(*expr).kind() {
let index =
name.as_tuple_index().ok_or(MirLowerError::TypeError("named field on tuple"))?
as u32;
@@ -1386,7 +1397,11 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
Ok(())
}
- fn lower_literal_or_const_to_operand(&mut self, ty: Ty, loc: &ExprId) -> Result<'db, Operand> {
+ fn lower_literal_or_const_to_operand(
+ &mut self,
+ ty: Ty<'db>,
+ loc: &ExprId,
+ ) -> Result<'db, Operand<'db>> {
match &self.body[*loc] {
Expr::Literal(l) => self.lower_literal_to_operand(ty, l),
Expr::Path(c) => {
@@ -1407,7 +1422,10 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
match pr {
ResolveValueResult::ValueNs(v, _) => {
if let ValueNs::ConstId(c) = v {
- self.lower_const_to_operand(Substitution::empty(Interner), c.into(), ty)
+ self.lower_const_to_operand(
+ GenericArgs::new_from_iter(self.interner(), []),
+ c.into(),
+ )
} else {
not_supported!("bad path in range pattern");
}
@@ -1423,13 +1441,8 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
}
}
- 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
- .layout_of_ty(ty.to_nextsolver(interner), self.env.clone())
- .map(|it| it.size.bytes_usize())
- };
+ fn lower_literal_to_operand(&mut self, ty: Ty<'db>, l: &Literal) -> Result<'db, Operand<'db>> {
+ let size = || self.db.layout_of_ty(ty, self.env.clone()).map(|it| it.size.bytes_usize());
const USIZE_SIZE: usize = size_of::<usize>();
let bytes: Box<[_]> = match l {
hir_def::hir::Literal::String(b) => {
@@ -1475,48 +1488,57 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
Ok(Operand::from_concrete_const(bytes, MemoryMap::default(), ty))
}
- fn new_basic_block(&mut self) -> BasicBlockId {
+ fn new_basic_block(&mut self) -> BasicBlockId<'db> {
self.result.basic_blocks.alloc(BasicBlock::default())
}
fn lower_const(
&mut self,
const_id: GeneralConstId,
- prev_block: BasicBlockId,
- place: Place,
- subst: Substitution,
+ prev_block: BasicBlockId<'db>,
+ place: Place<'db>,
+ subst: GenericArgs<'db>,
span: MirSpan,
- ty: Ty,
) -> Result<'db, ()> {
- let c = self.lower_const_to_operand(subst, const_id, ty)?;
+ let c = self.lower_const_to_operand(subst, const_id)?;
self.push_assignment(prev_block, place, c.into(), span);
Ok(())
}
fn lower_const_to_operand(
&mut self,
- subst: Substitution,
+ subst: GenericArgs<'db>,
const_id: GeneralConstId,
- ty: Ty,
- ) -> Result<'db, Operand> {
- let c = if subst.len(Interner) != 0 {
+ ) -> Result<'db, Operand<'db>> {
+ let konst = if subst.len() != 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)
+ Const::new_unevaluated(
+ self.interner(),
+ UnevaluatedConst { def: const_id.into(), args: subst },
+ )
} else {
let name = const_id.name(self.db);
self.db
.const_eval(const_id, subst, None)
.map_err(|e| MirLowerError::ConstEvalError(name.into(), Box::new(e)))?
};
- Ok(Operand { kind: OperandKind::Constant(c), span: None })
+ let ty = self
+ .db
+ .value_ty(match const_id {
+ GeneralConstId::ConstId(id) => id.into(),
+ GeneralConstId::StaticId(id) => id.into(),
+ })
+ .unwrap()
+ .instantiate(self.interner(), subst);
+ Ok(Operand { kind: OperandKind::Constant { konst, ty }, span: None })
}
fn write_bytes_to_place(
&mut self,
- prev_block: BasicBlockId,
- place: Place,
+ prev_block: BasicBlockId<'db>,
+ place: Place<'db>,
cv: Box<[u8]>,
- ty: Ty,
+ ty: Ty<'db>,
span: MirSpan,
) -> Result<'db, ()> {
self.push_assignment(prev_block, place, Operand::from_bytes(cv, ty).into(), span);
@@ -1526,14 +1548,14 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_enum_variant(
&mut self,
variant_id: EnumVariantId,
- prev_block: BasicBlockId,
- place: Place,
- ty: Ty,
- fields: Box<[Operand]>,
+ prev_block: BasicBlockId<'db>,
+ place: Place<'db>,
+ ty: Ty<'db>,
+ fields: Box<[Operand<'db>]>,
span: MirSpan,
- ) -> Result<'db, BasicBlockId> {
- let subst = match ty.kind(Interner) {
- TyKind::Adt(_, subst) => subst.clone(),
+ ) -> Result<'db, BasicBlockId<'db>> {
+ let subst = match ty.kind() {
+ TyKind::Adt(_, subst) => subst,
_ => implementation_error!("Non ADT enum"),
};
self.push_assignment(
@@ -1547,13 +1569,13 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_call_and_args(
&mut self,
- func: Operand,
+ func: Operand<'db>,
args: impl Iterator<Item = ExprId>,
- place: Place,
- mut current: BasicBlockId,
+ place: Place<'db>,
+ mut current: BasicBlockId<'db>,
is_uninhabited: bool,
span: MirSpan,
- ) -> Result<'db, Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId<'db>>> {
let Some(args) = args
.map(|arg| {
if let Some((temp, c)) = self.lower_expr_to_some_operand(arg, current)? {
@@ -1572,13 +1594,13 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_call(
&mut self,
- func: Operand,
- args: Box<[Operand]>,
- place: Place,
- current: BasicBlockId,
+ func: Operand<'db>,
+ args: Box<[Operand<'db>]>,
+ place: Place<'db>,
+ current: BasicBlockId<'db>,
is_uninhabited: bool,
span: MirSpan,
- ) -> Result<'db, Option<BasicBlockId>> {
+ ) -> Result<'db, Option<BasicBlockId<'db>>> {
let b = if is_uninhabited { None } else { Some(self.new_basic_block()) };
self.set_terminator(
current,
@@ -1595,56 +1617,63 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
Ok(b)
}
- fn is_unterminated(&mut self, source: BasicBlockId) -> bool {
+ fn is_unterminated(&mut self, source: BasicBlockId<'db>) -> bool {
self.result.basic_blocks[source].terminator.is_none()
}
- fn set_terminator(&mut self, source: BasicBlockId, terminator: TerminatorKind, span: MirSpan) {
+ fn set_terminator(
+ &mut self,
+ source: BasicBlockId<'db>,
+ terminator: TerminatorKind<'db>,
+ span: MirSpan,
+ ) {
self.result.basic_blocks[source].terminator = Some(Terminator { span, kind: terminator });
}
- fn set_goto(&mut self, source: BasicBlockId, target: BasicBlockId, span: MirSpan) {
+ fn set_goto(&mut self, source: BasicBlockId<'db>, target: BasicBlockId<'db>, span: MirSpan) {
self.set_terminator(source, TerminatorKind::Goto { target }, span);
}
- fn expr_ty_without_adjust(&self, e: ExprId) -> Ty {
- self.infer[e].to_chalk(self.interner)
+ fn expr_ty_without_adjust(&self, e: ExprId) -> Ty<'db> {
+ self.infer[e]
}
- fn expr_ty_after_adjustments(&self, e: ExprId) -> Ty {
+ fn expr_ty_after_adjustments(&self, e: ExprId) -> Ty<'db> {
let mut ty = None;
if let Some(it) = self.infer.expr_adjustments.get(&e)
&& let Some(it) = it.last()
{
- ty = Some(it.target.to_chalk(self.interner));
+ ty = Some(it.target);
}
ty.unwrap_or_else(|| self.expr_ty_without_adjust(e))
}
- fn push_statement(&mut self, block: BasicBlockId, statement: Statement) {
+ fn push_statement(&mut self, block: BasicBlockId<'db>, statement: Statement<'db>) {
self.result.basic_blocks[block].statements.push(statement);
}
- fn push_fake_read(&mut self, block: BasicBlockId, p: Place, span: MirSpan) {
+ fn push_fake_read(&mut self, block: BasicBlockId<'db>, p: Place<'db>, span: MirSpan) {
self.push_statement(block, StatementKind::FakeRead(p).with_span(span));
}
fn push_assignment(
&mut self,
- block: BasicBlockId,
- place: Place,
- rvalue: Rvalue,
+ block: BasicBlockId<'db>,
+ place: Place<'db>,
+ rvalue: Rvalue<'db>,
span: MirSpan,
) {
self.push_statement(block, StatementKind::Assign(place, rvalue).with_span(span));
}
- fn discr_temp_place(&mut self, current: BasicBlockId) -> Place {
+ fn discr_temp_place(&mut self, current: BasicBlockId<'db>) -> Place<'db> {
match &self.discr_temp {
Some(it) => *it,
None => {
- let tmp: Place = self
- .temp(TyBuilder::discr_ty(), current, MirSpan::Unknown)
+ // FIXME: rustc's ty is dependent on the adt type, maybe we need to do that as well
+ let discr_ty = Ty::new_int(self.interner(), rustc_type_ir::IntTy::I128);
+ let tmp: Place<'db> = self
+ .temp(discr_ty, current, MirSpan::Unknown)
.expect("discr_ty is never unsized")
.into();
self.discr_temp = Some(tmp);
@@ -1655,12 +1684,12 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_loop(
&mut self,
- prev_block: BasicBlockId,
- place: Place,
+ prev_block: BasicBlockId<'db>,
+ place: Place<'db>,
label: Option<LabelId>,
span: MirSpan,
- f: impl FnOnce(&mut MirLowerCtx<'_, 'db>, BasicBlockId) -> Result<'db, ()>,
- ) -> Result<'db, Option<BasicBlockId>> {
+ f: impl FnOnce(&mut MirLowerCtx<'_, 'db>, BasicBlockId<'db>) -> Result<'db, ()>,
+ ) -> Result<'db, Option<BasicBlockId<'db>>> {
let begin = self.new_basic_block();
let prev = self.current_loop_blocks.replace(LoopBlocks {
begin,
@@ -1695,10 +1724,10 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn merge_blocks(
&mut self,
- b1: Option<BasicBlockId>,
- b2: Option<BasicBlockId>,
+ b1: Option<BasicBlockId<'db>>,
+ b2: Option<BasicBlockId<'db>>,
span: MirSpan,
- ) -> Option<BasicBlockId> {
+ ) -> Option<BasicBlockId<'db>> {
match (b1, b2) {
(None, None) => None,
(None, Some(b)) | (Some(b), None) => Some(b),
@@ -1711,7 +1740,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
}
}
- fn current_loop_end(&mut self) -> Result<'db, BasicBlockId> {
+ fn current_loop_end(&mut self) -> Result<'db, BasicBlockId<'db>> {
let r = match self
.current_loop_blocks
.as_mut()
@@ -1738,7 +1767,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn is_uninhabited(&self, expr_id: ExprId) -> bool {
is_ty_uninhabited_from(
self.db,
- &self.infer[expr_id].to_chalk(self.interner),
+ &self.infer[expr_id].to_chalk(self.interner()),
self.owner.module(self.db),
self.env.clone(),
)
@@ -1746,15 +1775,15 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
/// 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<'db, ()> {
+ fn push_storage_live(&mut self, b: BindingId, current: BasicBlockId<'db>) -> Result<'db, ()> {
let l = self.binding_local(b)?;
self.push_storage_live_for_local(l, current, MirSpan::BindingId(b))
}
fn push_storage_live_for_local(
&mut self,
- l: LocalId,
- current: BasicBlockId,
+ l: LocalId<'db>,
+ current: BasicBlockId<'db>,
span: MirSpan,
) -> Result<'db, ()> {
self.drop_scopes.last_mut().unwrap().locals.push(l);
@@ -1770,11 +1799,11 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_block_to_place(
&mut self,
statements: &[hir_def::hir::Statement],
- mut current: BasicBlockId,
+ mut current: BasicBlockId<'db>,
tail: Option<ExprId>,
- place: Place,
+ place: Place<'db>,
span: MirSpan,
- ) -> Result<'db, Option<Idx<BasicBlock>>> {
+ ) -> Result<'db, Option<Idx<BasicBlock<'db>>>> {
let scope = self.push_drop_scope();
for statement in statements.iter() {
match statement {
@@ -1847,10 +1876,10 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn lower_params_and_bindings(
&mut self,
- params: impl Iterator<Item = (PatId, Ty)> + Clone,
- self_binding: Option<(BindingId, Ty)>,
+ params: impl Iterator<Item = (PatId, Ty<'db>)> + Clone,
+ self_binding: Option<(BindingId, Ty<'db>)>,
pick_binding: impl Fn(BindingId) -> bool,
- ) -> Result<'db, BasicBlockId> {
+ ) -> Result<'db, BasicBlockId<'db>> {
let base_param_count = self.result.param_locals.len();
let self_binding = match self_binding {
Some((self_binding, ty)) => {
@@ -1881,10 +1910,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
continue;
}
if !self.result.binding_locals.contains_idx(id) {
- self.result.binding_locals.insert(
- id,
- self.result.locals.alloc(Local { ty: self.infer[id].to_chalk(self.interner) }),
- );
+ self.result
+ .binding_locals
+ .insert(id, self.result.locals.alloc(Local { ty: self.infer[id] }));
}
}
let mut current = self.result.start_block;
@@ -1919,7 +1947,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
Ok(current)
}
- fn binding_local(&self, b: BindingId) -> Result<'db, LocalId> {
+ fn binding_local(&self, b: BindingId) -> Result<'db, LocalId<'db>> {
match self.result.binding_locals.get(b) {
Some(it) => Ok(*it),
None => {
@@ -1968,9 +1996,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn drop_until_scope(
&mut self,
scope_index: usize,
- mut current: BasicBlockId,
+ mut current: BasicBlockId<'db>,
span: MirSpan,
- ) -> BasicBlockId {
+ ) -> BasicBlockId<'db> {
for scope in self.drop_scopes[scope_index..].to_vec().iter().rev() {
self.emit_drop_and_storage_dead_for_scope(scope, &mut current, span);
}
@@ -1990,9 +2018,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
/// Don't call directly
fn pop_drop_scope_internal(
&mut self,
- mut current: BasicBlockId,
+ mut current: BasicBlockId<'db>,
span: MirSpan,
- ) -> BasicBlockId {
+ ) -> BasicBlockId<'db> {
let scope = self.drop_scopes.pop().unwrap();
self.emit_drop_and_storage_dead_for_scope(&scope, &mut current, span);
current
@@ -2000,9 +2028,9 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn pop_drop_scope_assert_finished(
&mut self,
- mut current: BasicBlockId,
+ mut current: BasicBlockId<'db>,
span: MirSpan,
- ) -> Result<'db, BasicBlockId> {
+ ) -> Result<'db, BasicBlockId<'db>> {
current = self.pop_drop_scope_internal(current, span);
if !self.drop_scopes.is_empty() {
implementation_error!("Mismatched count between drop scope push and pops");
@@ -2012,12 +2040,12 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn emit_drop_and_storage_dead_for_scope(
&mut self,
- scope: &DropScope,
- current: &mut Idx<BasicBlock>,
+ scope: &DropScope<'db>,
+ current: &mut Idx<BasicBlock<'db>>,
span: MirSpan,
) {
for &l in scope.locals.iter().rev() {
- if !self.result.locals[l].ty.clone().is_copy(self.db, self.owner) {
+ if !self.infcx.type_is_copy_modulo_regions(self.env.env, self.result.locals[l].ty) {
let prev = std::mem::replace(current, self.new_basic_block());
self.set_terminator(
prev,
@@ -2032,12 +2060,11 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
fn cast_kind<'db>(
db: &'db dyn HirDatabase,
- source_ty: &Ty,
- target_ty: &Ty,
+ source_ty: Ty<'db>,
+ target_ty: Ty<'db>,
) -> 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));
+ let from = CastTy::from_ty(db, source_ty);
+ let cast = CastTy::from_ty(db, target_ty);
Ok(match (from, cast) {
(Some(CastTy::Ptr(..) | CastTy::FnPtr), Some(CastTy::Int(_))) => {
CastKind::PointerExposeAddress
@@ -2056,7 +2083,7 @@ fn cast_kind<'db>(
pub fn mir_body_for_closure_query<'db>(
db: &'db dyn HirDatabase,
closure: InternedClosureId,
-) -> Result<'db, Arc<MirBody>> {
+) -> Result<'db, Arc<MirBody<'db>>> {
let InternedClosure(owner, expr) = db.lookup_intern_closure(closure);
let body = db.body(owner);
let infer = db.infer(owner);
@@ -2068,29 +2095,34 @@ pub fn mir_body_for_closure_query<'db>(
};
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].to_chalk(ctx.interner) });
+ ctx.result.locals.alloc(Local { ty: infer[*root] });
let closure_local = ctx.result.locals.alloc(Local {
ty: match kind {
- FnTrait::FnOnce | FnTrait::AsyncFnOnce => infer[expr].to_chalk(ctx.interner),
- FnTrait::FnMut | FnTrait::AsyncFnMut => {
- 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].to_chalk(ctx.interner))
- .intern(Interner)
- }
+ FnTrait::FnOnce | FnTrait::AsyncFnOnce => infer[expr],
+ FnTrait::FnMut | FnTrait::AsyncFnMut => Ty::new_ref(
+ ctx.interner(),
+ Region::error(ctx.interner()),
+ infer[expr],
+ Mutability::Mut,
+ ),
+ FnTrait::Fn | FnTrait::AsyncFn => Ty::new_ref(
+ ctx.interner(),
+ Region::error(ctx.interner()),
+ infer[expr],
+ Mutability::Not,
+ ),
},
});
ctx.result.param_locals.push(closure_local);
- let Some(sig) = ClosureSubst(substs).sig_ty(db).callable_sig(db) else {
+ let Some(sig) =
+ substs.split_closure_args_untupled().closure_sig_as_fn_ptr_ty.callable_sig(ctx.interner())
+ else {
implementation_error!("closure has not callable sig");
};
let resolver_guard = ctx.resolver.update_to_inner_scope(db, owner, expr);
let current = ctx.lower_params_and_bindings(
- args.iter().zip(sig.params().iter()).map(|(it, y)| (*it, y.clone())),
+ args.iter().zip(sig.skip_binder().inputs().iter()).map(|(it, y)| (*it, y)),
None,
|_| true,
)?;
@@ -2099,7 +2131,8 @@ pub fn mir_body_for_closure_query<'db>(
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<'db>, 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));
@@ -2164,7 +2197,7 @@ pub fn mir_body_for_closure_query<'db>(
pub fn mir_body_query<'db>(
db: &'db dyn HirDatabase,
def: DefWithBodyId,
-) -> Result<'db, Arc<MirBody>> {
+) -> Result<'db, Arc<MirBody<'db>>> {
let krate = def.krate(db);
let edition = krate.data(db).edition;
let detail = match def {
@@ -2200,7 +2233,7 @@ pub fn mir_body_query<'db>(
pub(crate) fn mir_body_cycle_result<'db>(
_db: &'db dyn HirDatabase,
_def: DefWithBodyId,
-) -> Result<'db, Arc<MirBody>> {
+) -> Result<'db, Arc<MirBody<'db>>> {
Err(MirLowerError::Loop)
}
@@ -2212,7 +2245,7 @@ pub fn lower_to_mir<'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<'db, MirBody> {
+) -> Result<'db, MirBody<'db>> {
if infer.type_mismatches().next().is_some() || infer.is_erroneous() {
return Err(MirLowerError::HasErrors);
}
@@ -2229,18 +2262,12 @@ pub fn lower_to_mir<'db>(
if body.body_expr == root_expr {
// otherwise it's an inline const, and has no parameter
if let DefWithBodyId::FunctionId(fid) = owner {
- let substs = TyBuilder::placeholder_subst(db, fid);
- let interner = DbInterner::new_with(db, None, None);
- let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
- let callable_sig = db
- .callable_item_signature(fid.into())
- .instantiate(interner, args)
- .skip_binder()
- .to_chalk(interner);
- let mut params = callable_sig.params().iter();
- let self_param = body.self_param.and_then(|id| Some((id, params.next()?.clone())));
+ let callable_sig =
+ db.callable_item_signature(fid.into()).instantiate_identity().skip_binder();
+ let mut params = callable_sig.inputs().iter();
+ let self_param = body.self_param.and_then(|id| Some((id, params.next()?)));
break 'b ctx.lower_params_and_bindings(
- body.params.iter().zip(params).map(|(it, y)| (*it, y.clone())),
+ body.params.iter().zip(params).map(|(it, y)| (*it, y)),
self_param,
binding_picker,
)?;