1 // run-pass 2 // This test verifies that temporaries created for `while`'s and `if` 3 // conditions are dropped after the condition is evaluated. 4 5 struct Temporary; 6 7 static mut DROPPED: isize = 0; 8 9 impl Drop for Temporary { drop(&mut self)10 fn drop(&mut self) { 11 unsafe { DROPPED += 1; } 12 } 13 } 14 15 impl Temporary { do_stuff(&self) -> bool16 fn do_stuff(&self) -> bool {true} 17 } 18 borrow() -> Box<Temporary>19fn borrow() -> Box<Temporary> { Box::new(Temporary) } 20 21 main()22pub fn main() { 23 let mut i = 0; 24 25 // This loop's condition 26 // should call `Temporary`'s 27 // `drop` 6 times. 28 while borrow().do_stuff() { 29 i += 1; 30 unsafe { assert_eq!(DROPPED, i) } 31 if i > 5 { 32 break; 33 } 34 } 35 36 // This if condition should 37 // call it 1 time 38 if borrow().do_stuff() { 39 unsafe { assert_eq!(DROPPED, i + 1) } 40 } 41 } 42