Skip to content

Commit

Permalink
Don't consider Let exprs terminating scopes
Browse files Browse the repository at this point in the history
  • Loading branch information
nathanwhit committed Oct 16, 2022
1 parent bf286a8 commit 3041bc9
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 8 deletions.
8 changes: 6 additions & 2 deletions compiler/rustc_hir_analysis/src/check/region.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/drop/drop_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@ impl DropOrderCollector {
// 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
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/drop/issue-100276.rs
Original file line number Diff line number Diff line change
@@ -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() {}
8 changes: 4 additions & 4 deletions src/test/ui/mir/mir_let_chains_drop_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use std::panic;
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> {
Expand Down Expand Up @@ -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]);

Expand Down Expand Up @@ -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]);
}

0 comments on commit 3041bc9

Please sign in to comment.