diff options
| author | Nathan Whitaker <nathan.whitaker01@gmail.com> | 2022-10-12 15:29:08 -0700 |
|---|---|---|
| committer | Nathan Whitaker <nathan.whitaker01@gmail.com> | 2022-10-12 17:57:32 -0700 |
| commit | ad8b24272428b28770471f222c19fa3154a65819 (patch) | |
| tree | f38880c0d0afd13e96210f9ff3dfbdf027b68107 /src/test | |
| parent | 0938e1680daf66ca6aad428aedf9a920a0dab5ad (diff) | |
| download | rust-ad8b24272428b28770471f222c19fa3154a65819.tar.gz rust-ad8b24272428b28770471f222c19fa3154a65819.zip | |
Let chains should still drop temporaries
by the end of the condition's execution
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/drop/drop_order.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/test/ui/drop/drop_order.rs b/src/test/ui/drop/drop_order.rs index e42150dcc09..bf740b6a9ab 100644 --- a/src/test/ui/drop/drop_order.rs +++ b/src/test/ui/drop/drop_order.rs @@ -1,4 +1,5 @@ // run-pass +#![feature(let_chains)] use std::cell::RefCell; use std::convert::TryInto; @@ -116,6 +117,58 @@ impl DropOrderCollector { } } + fn let_chain(&self) { + // take the "then" branch + if self.option_loud_drop(2).is_some() // 2 + && self.option_loud_drop(1).is_some() // 1 + && let Some(_d) = self.option_loud_drop(4) { // 4 + self.print(3); // 3 + } + + // 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 + unreachable!(); + } else { + self.print(8); // 4 + } + + // let exprs interspersed + if self.option_loud_drop(9).is_some() // 1 + && let Some(_d) = self.option_loud_drop(13) // 5 + && self.option_loud_drop(10).is_some() // 2 + && let Some(_e) = self.option_loud_drop(12) { // 4 + self.print(11); // 3 + } + + // let exprs first + if let Some(_d) = self.option_loud_drop(18) // 5 + && let Some(_e) = self.option_loud_drop(17) // 4 + && self.option_loud_drop(14).is_some() // 1 + && self.option_loud_drop(15).is_some() { // 2 + self.print(16); // 3 + } + + // let exprs last + if self.option_loud_drop(20).is_some() // 2 + && self.option_loud_drop(19).is_some() // 1 + && let Some(_d) = self.option_loud_drop(23) // 5 + && let Some(_e) = self.option_loud_drop(22) { // 4 + self.print(21); // 3 + } + } + + fn while_(&self) { + let mut v = self.option_loud_drop(4); + while let Some(_d) = v + && self.option_loud_drop(1).is_some() + && self.option_loud_drop(2).is_some() { + self.print(3); + v = None; + } + } + fn assert_sorted(self) { assert!( self.0 @@ -142,4 +195,14 @@ fn main() { let collector = DropOrderCollector::default(); collector.match_(); collector.assert_sorted(); + + println!("-- let chain --"); + let collector = DropOrderCollector::default(); + collector.let_chain(); + collector.assert_sorted(); + + println!("-- while --"); + let collector = DropOrderCollector::default(); + collector.while_(); + collector.assert_sorted(); } |
