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.rs | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/crates/hir-ty/src/mir/lower/as_place.rs b/crates/hir-ty/src/mir/lower/as_place.rs index 425904850b..86fee99b78 100644 --- a/crates/hir-ty/src/mir/lower/as_place.rs +++ b/crates/hir-ty/src/mir/lower/as_place.rs @@ -192,7 +192,10 @@ impl MirLowerCtx<'_> { let base_ty = self.expr_ty_after_adjustments(*base); let index_ty = self.expr_ty_after_adjustments(*index); if index_ty != TyBuilder::usize() - || !matches!(base_ty.kind(Interner), TyKind::Array(..) | TyKind::Slice(..)) + || !matches!( + base_ty.strip_reference().kind(Interner), + TyKind::Array(..) | TyKind::Slice(..) + ) { let Some(index_fn) = self.infer.method_resolution(expr_id) else { return Err(MirLowerError::UnresolvedMethod); @@ -206,7 +209,7 @@ impl MirLowerCtx<'_> { return self.lower_overloaded_index( current, base_place, - self.expr_ty_after_adjustments(*base), + base_ty, self.expr_ty(expr_id), index_operand, expr_id.into(), @@ -214,7 +217,8 @@ impl MirLowerCtx<'_> { ); } let Some((mut p_base, current)) = - self.lower_expr_as_place(current, *base, true)? else { + self.lower_expr_as_place_without_adjust(current, *base, true)? + else { return Ok(None); }; let l_index = self.temp(self.expr_ty_after_adjustments(*index))?; @@ -238,23 +242,14 @@ impl MirLowerCtx<'_> { span: MirSpan, index_fn: (FunctionId, Substitution), ) -> Result<Option<(Place, BasicBlockId)>> { - let is_mutable = 'b: { - if let Some(index_mut_trait) = self.resolve_lang_item(LangItem::IndexMut)?.as_trait() { - if let Some(index_mut_fn) = - self.db.trait_data(index_mut_trait).method_by_name(&name![index_mut]) - { - break 'b index_mut_fn == index_fn.0; - } + let (mutability, borrow_kind) = match base_ty.as_reference() { + Some((_, _, mutability)) => { + (mutability, BorrowKind::Mut { allow_two_phase_borrow: false }) } - false - }; - let (mutability, borrow_kind) = match is_mutable { - true => (Mutability::Mut, BorrowKind::Mut { allow_two_phase_borrow: false }), - false => (Mutability::Not, BorrowKind::Shared), + None => (Mutability::Not, BorrowKind::Shared), }; - let base_ref = TyKind::Ref(mutability, static_lifetime(), base_ty).intern(Interner); let result_ref = TyKind::Ref(mutability, static_lifetime(), result_ty).intern(Interner); - let ref_place: Place = self.temp(base_ref)?.into(); + let ref_place: Place = self.temp(base_ty)?.into(); self.push_assignment(current, ref_place.clone(), Rvalue::Ref(borrow_kind, place), span); let mut result: Place = self.temp(result_ref)?.into(); let index_fn_op = Operand::const_zst( |