//@ run-pass #![allow(dead_code)] // Ensures that destructors are run for expressions of the form "let _ = e;" // where `e` is a type which requires a destructor. // FIXME(static_mut_refs): Do not allow `static_mut_refs` lint #![allow(static_mut_refs)] struct Foo; struct Bar { x: isize } struct Baz(isize); enum FooBar { _Foo(Foo), _Bar(usize) } static mut NUM_DROPS: usize = 0; impl Drop for Foo { fn drop(&mut self) { unsafe { NUM_DROPS += 1; } } } impl Drop for Bar { fn drop(&mut self) { unsafe { NUM_DROPS += 1; } } } impl Drop for Baz { fn drop(&mut self) { unsafe { NUM_DROPS += 1; } } } impl Drop for FooBar { fn drop(&mut self) { unsafe { NUM_DROPS += 1; } } } fn main() { assert_eq!(unsafe { NUM_DROPS }, 0); { let _x = Foo; } assert_eq!(unsafe { NUM_DROPS }, 1); { let _x = Bar { x: 21 }; } assert_eq!(unsafe { NUM_DROPS }, 2); { let _x = Baz(21); } assert_eq!(unsafe { NUM_DROPS }, 3); { let _x = FooBar::_Foo(Foo); } assert_eq!(unsafe { NUM_DROPS }, 5); { let _x = FooBar::_Bar(42); } assert_eq!(unsafe { NUM_DROPS }, 6); { let _ = Foo; } assert_eq!(unsafe { NUM_DROPS }, 7); { let _ = Bar { x: 21 }; } assert_eq!(unsafe { NUM_DROPS }, 8); { let _ = Baz(21); } assert_eq!(unsafe { NUM_DROPS }, 9); { let _ = FooBar::_Foo(Foo); } assert_eq!(unsafe { NUM_DROPS }, 11); { let _ = FooBar::_Bar(42); } assert_eq!(unsafe { NUM_DROPS }, 12); }