Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/expr.rs')
-rw-r--r--crates/hir-ty/src/infer/expr.rs39
1 files changed, 29 insertions, 10 deletions
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index e40c6a63f6..89d92ea9af 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -635,7 +635,10 @@ impl InferenceContext<'_> {
let inner_ty = self.infer_expr_inner(*expr, &expectation);
match rawness {
Rawness::RawPtr => TyKind::Raw(mutability, inner_ty),
- Rawness::Ref => TyKind::Ref(mutability, error_lifetime(), inner_ty),
+ Rawness::Ref => {
+ let lt = self.table.new_lifetime_var();
+ TyKind::Ref(mutability, lt, inner_ty)
+ }
}
.intern(Interner)
}
@@ -786,7 +789,11 @@ impl InferenceContext<'_> {
adj.apply(&mut self.table, base_ty)
});
// mutability will be fixed up in `InferenceContext::infer_mut`;
- adj.push(Adjustment::borrow(Mutability::Not, self_ty.clone()));
+ adj.push(Adjustment::borrow(
+ Mutability::Not,
+ self_ty.clone(),
+ self.table.new_lifetime_var(),
+ ));
self.write_expr_adj(*base, adj);
if let Some(func) = self
.db
@@ -991,7 +998,7 @@ impl InferenceContext<'_> {
match fn_x {
FnTrait::FnOnce => (),
FnTrait::FnMut => {
- if let TyKind::Ref(Mutability::Mut, _, inner) = derefed_callee.kind(Interner) {
+ if let TyKind::Ref(Mutability::Mut, lt, inner) = derefed_callee.kind(Interner) {
if adjustments
.last()
.map(|it| matches!(it.kind, Adjust::Borrow(_)))
@@ -1000,15 +1007,27 @@ impl InferenceContext<'_> {
// prefer reborrow to move
adjustments
.push(Adjustment { kind: Adjust::Deref(None), target: inner.clone() });
- adjustments.push(Adjustment::borrow(Mutability::Mut, inner.clone()))
+ adjustments.push(Adjustment::borrow(
+ Mutability::Mut,
+ inner.clone(),
+ lt.clone(),
+ ))
}
} else {
- adjustments.push(Adjustment::borrow(Mutability::Mut, derefed_callee.clone()));
+ adjustments.push(Adjustment::borrow(
+ Mutability::Mut,
+ derefed_callee.clone(),
+ self.table.new_lifetime_var(),
+ ));
}
}
FnTrait::Fn => {
if !matches!(derefed_callee.kind(Interner), TyKind::Ref(Mutability::Not, _, _)) {
- adjustments.push(Adjustment::borrow(Mutability::Not, derefed_callee.clone()));
+ adjustments.push(Adjustment::borrow(
+ Mutability::Not,
+ derefed_callee.clone(),
+ self.table.new_lifetime_var(),
+ ));
}
}
}
@@ -1313,11 +1332,11 @@ impl InferenceContext<'_> {
Some(sig) => {
let p_left = &sig.params()[0];
if matches!(op, BinaryOp::CmpOp(..) | BinaryOp::Assignment { .. }) {
- if let &TyKind::Ref(mtbl, _, _) = p_left.kind(Interner) {
+ if let TyKind::Ref(mtbl, lt, _) = p_left.kind(Interner) {
self.write_expr_adj(
lhs,
vec![Adjustment {
- kind: Adjust::Borrow(AutoBorrow::Ref(mtbl)),
+ kind: Adjust::Borrow(AutoBorrow::Ref(lt.clone(), *mtbl)),
target: p_left.clone(),
}],
);
@@ -1325,11 +1344,11 @@ impl InferenceContext<'_> {
}
let p_right = &sig.params()[1];
if matches!(op, BinaryOp::CmpOp(..)) {
- if let &TyKind::Ref(mtbl, _, _) = p_right.kind(Interner) {
+ if let TyKind::Ref(mtbl, lt, _) = p_right.kind(Interner) {
self.write_expr_adj(
rhs,
vec![Adjustment {
- kind: Adjust::Borrow(AutoBorrow::Ref(mtbl)),
+ kind: Adjust::Borrow(AutoBorrow::Ref(lt.clone(), *mtbl)),
target: p_right.clone(),
}],
);