Don't consider Let
exprs terminating scopes
This commit is contained in:
parent
bf286a82e2
commit
3041bc9e71
@ -252,9 +252,13 @@ fn resolve_expr<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, expr: &'tcx h
|
||||
) => {
|
||||
// For shortcircuiting operators, mark the RHS as a terminating
|
||||
// scope since it only executes conditionally.
|
||||
terminating(r.hir_id.local_id);
|
||||
}
|
||||
|
||||
// `Let` expressions (in a let-chain) shouldn't be terminating, as their temporaries
|
||||
// should live beyond the immediate expression
|
||||
if !matches!(r.kind, hir::ExprKind::Let(_)) {
|
||||
terminating(r.hir_id.local_id);
|
||||
}
|
||||
}
|
||||
hir::ExprKind::If(_, ref then, Some(ref otherwise)) => {
|
||||
terminating(then.hir_id.local_id);
|
||||
terminating(otherwise.hir_id.local_id);
|
||||
|
@ -129,10 +129,10 @@ fn let_chain(&self) {
|
||||
// take the "else" branch
|
||||
if self.option_loud_drop(6).is_some() // 2
|
||||
&& self.option_loud_drop(5).is_some() // 1
|
||||
&& let None = self.option_loud_drop(7) { // 3
|
||||
&& let None = self.option_loud_drop(8) { // 4
|
||||
unreachable!();
|
||||
} else {
|
||||
self.print(8); // 4
|
||||
self.print(7); // 3
|
||||
}
|
||||
|
||||
// let exprs interspersed
|
||||
|
12
src/test/ui/drop/issue-100276.rs
Normal file
12
src/test/ui/drop/issue-100276.rs
Normal file
@ -0,0 +1,12 @@
|
||||
// check-pass
|
||||
// compile-flags: -Z validate-mir
|
||||
#![feature(let_chains)]
|
||||
|
||||
fn let_chains(entry: std::io::Result<std::fs::DirEntry>) {
|
||||
if let Ok(entry) = entry
|
||||
&& let Some(s) = entry.file_name().to_str()
|
||||
&& s.contains("")
|
||||
{}
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -12,7 +12,7 @@
|
||||
pub struct DropLogger<'a, T> {
|
||||
extra: T,
|
||||
id: usize,
|
||||
log: &'a panic::AssertUnwindSafe<RefCell<Vec<usize>>>
|
||||
log: &'a panic::AssertUnwindSafe<RefCell<Vec<usize>>>,
|
||||
}
|
||||
|
||||
impl<'a, T> Drop for DropLogger<'a, T> {
|
||||
@ -55,9 +55,9 @@ fn main() {
|
||||
else {
|
||||
// 10 is not constructed
|
||||
d(10, None)
|
||||
}
|
||||
},
|
||||
);
|
||||
assert_eq!(get(), vec![3, 8, 7, 1, 2]);
|
||||
assert_eq!(get(), vec![8, 7, 1, 3, 2]);
|
||||
}
|
||||
assert_eq!(get(), vec![0, 4, 6, 9, 5]);
|
||||
|
||||
@ -89,5 +89,5 @@ fn main() {
|
||||
panic::panic_any(InjectedFailure)
|
||||
);
|
||||
});
|
||||
assert_eq!(get(), vec![14, 19, 20, 17, 15, 11, 18, 16, 12, 13]);
|
||||
assert_eq!(get(), vec![20, 17, 15, 11, 19, 18, 16, 12, 14, 13]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user