Merge pull request #20161 from ShoyuVanilla/closure-capture

fix: Incorrect closure capturing for let exprs
This commit is contained in:
Lukas Wirth 2025-07-03 15:42:11 +00:00 committed by GitHub
commit 87940a999f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 48 additions and 5 deletions

View File

@ -1229,10 +1229,11 @@ impl InferenceContext<'_> {
self.select_from_expr(*expr);
}
}
Expr::Let { pat: _, expr } => {
Expr::Let { pat, expr } => {
self.walk_expr(*expr);
let place = self.place_of_expr(*expr);
self.ref_expr(*expr, place);
if let Some(place) = self.place_of_expr(*expr) {
self.consume_with_pat(place, *pat);
}
}
Expr::UnaryOp { expr, op: _ }
| Expr::Array(Array::Repeat { initializer: expr, repeat: _ })

View File

@ -446,7 +446,7 @@ fn main() {
}
#[test]
fn let_binding_is_a_ref_capture() {
fn let_binding_is_a_ref_capture_in_ref_binding() {
check_closure_captures(
r#"
//- minicore:copy
@ -454,12 +454,36 @@ struct S;
fn main() {
let mut s = S;
let s_ref = &mut s;
let mut s2 = S;
let s_ref2 = &mut s2;
let closure = || {
if let ref cb = s_ref {
} else if let ref mut cb = s_ref2 {
}
};
}
"#,
expect!["83..135;49..54;112..117 ByRef(Shared) s_ref &'? &'? mut S"],
expect![[r#"
129..225;49..54;149..155 ByRef(Shared) s_ref &'? &'? mut S
129..225;93..99;188..198 ByRef(Mut { kind: Default }) s_ref2 &'? mut &'? mut S"#]],
);
}
#[test]
fn let_binding_is_a_value_capture_in_binding() {
check_closure_captures(
r#"
//- minicore:copy, option
struct Box(i32);
fn main() {
let b = Some(Box(0));
let closure = || {
if let Some(b) = b {
let _move = b;
}
};
}
"#,
expect!["73..149;37..38;103..104 ByValue b Option<Box>"],
);
}

View File

@ -236,6 +236,24 @@ impl S {
};
}
}
"#,
)
}
#[test]
fn regression_20155() {
check_diagnostics(
r#"
//- minicore: copy, option
struct Box(i32);
fn test() {
let b = Some(Box(0));
|| {
if let Some(b) = b {
let _move = b;
}
};
}
"#,
)
}