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 | 94 |
1 files changed, 45 insertions, 49 deletions
diff --git a/crates/hir-ty/src/mir/lower/as_place.rs b/crates/hir-ty/src/mir/lower/as_place.rs index cb5588a5c1..8d15794402 100644 --- a/crates/hir-ty/src/mir/lower/as_place.rs +++ b/crates/hir-ty/src/mir/lower/as_place.rs @@ -148,7 +148,7 @@ impl MirLowerCtx<'_> { let temp: Place = self.temp(ref_ty, current, expr_id.into())?.into(); self.push_assignment( current, - temp.clone(), + temp, Operand::Static(s).into(), expr_id.into(), ); @@ -160,57 +160,53 @@ impl MirLowerCtx<'_> { _ => try_rvalue(self), } } - Expr::UnaryOp { expr, op } => match op { - hir_def::hir::UnaryOp::Deref => { - let is_builtin = match self.expr_ty_without_adjust(*expr).kind(Interner) { - TyKind::Ref(..) | TyKind::Raw(..) => true, - TyKind::Adt(id, _) => { - if let Some(lang_item) = self.db.lang_attr(id.0.into()) { - lang_item == LangItem::OwnedBox - } else { - false - } + Expr::UnaryOp { expr, op: hir_def::hir::UnaryOp::Deref } => { + let is_builtin = match self.expr_ty_without_adjust(*expr).kind(Interner) { + TyKind::Ref(..) | TyKind::Raw(..) => true, + TyKind::Adt(id, _) => { + if let Some(lang_item) = self.db.lang_attr(id.0.into()) { + lang_item == LangItem::OwnedBox + } else { + false } - _ => false, + } + _ => false, + }; + if !is_builtin { + let Some((p, current)) = self.lower_expr_as_place(current, *expr, true)? else { + return Ok(None); }; - if !is_builtin { - let Some((p, current)) = self.lower_expr_as_place(current, *expr, true)? - else { - return Ok(None); - }; - return self.lower_overloaded_deref( - current, - p, - self.expr_ty_after_adjustments(*expr), - self.expr_ty_without_adjust(expr_id), - expr_id.into(), - 'b: { - if let Some((f, _)) = self.infer.method_resolution(expr_id) { - if let Some(deref_trait) = - self.resolve_lang_item(LangItem::DerefMut)?.as_trait() + return self.lower_overloaded_deref( + current, + p, + self.expr_ty_after_adjustments(*expr), + self.expr_ty_without_adjust(expr_id), + expr_id.into(), + 'b: { + if let Some((f, _)) = self.infer.method_resolution(expr_id) { + if let Some(deref_trait) = + self.resolve_lang_item(LangItem::DerefMut)?.as_trait() + { + if let Some(deref_fn) = self + .db + .trait_data(deref_trait) + .method_by_name(&name![deref_mut]) { - if let Some(deref_fn) = self - .db - .trait_data(deref_trait) - .method_by_name(&name![deref_mut]) - { - break 'b deref_fn == f; - } + break 'b deref_fn == f; } } - false - }, - ); - } - 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); - Ok(Some((r, current))) + } + false + }, + ); } - _ => try_rvalue(self), - }, + 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); + Ok(Some((r, current))) + } + Expr::UnaryOp { .. } => try_rvalue(self), Expr::Field { expr, .. } => { let Some((mut r, current)) = self.lower_expr_as_place(current, *expr, true)? else { return Ok(None); @@ -304,7 +300,7 @@ impl MirLowerCtx<'_> { let Some(current) = self.lower_call( index_fn_op, Box::new([Operand::Copy(place), index_operand]), - result.clone(), + result, current, false, span, @@ -338,7 +334,7 @@ impl MirLowerCtx<'_> { let ty_ref = TyKind::Ref(chalk_mut, static_lifetime(), source_ty.clone()).intern(Interner); let target_ty_ref = TyKind::Ref(chalk_mut, static_lifetime(), target_ty).intern(Interner); let ref_place: Place = self.temp(ty_ref, current, span)?.into(); - self.push_assignment(current, ref_place.clone(), Rvalue::Ref(borrow_kind, place), span); + self.push_assignment(current, ref_place, Rvalue::Ref(borrow_kind, place), span); let deref_trait = self .resolve_lang_item(trait_lang_item)? .as_trait() @@ -359,7 +355,7 @@ impl MirLowerCtx<'_> { let Some(current) = self.lower_call( deref_fn_op, Box::new([Operand::Copy(ref_place)]), - result.clone(), + result, current, false, span, |