]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/issue-10734.rs
a6af2327c9e8096f73cea2876aadb63e41742a2f
[rust.git] / src / test / run-pass / issue-10734.rs
1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 #![feature(unsafe_no_drop_flag)]
12
13 static mut drop_count: uint = 0;
14
15 #[unsafe_no_drop_flag]
16 struct Foo {
17     dropped: bool
18 }
19
20 impl Drop for Foo {
21     fn drop(&mut self) {
22         // Test to make sure we haven't dropped already
23         assert!(!self.dropped);
24         self.dropped = true;
25         // And record the fact that we dropped for verification later
26         unsafe { drop_count += 1; }
27     }
28 }
29
30 pub fn main() {
31     // An `if true { expr }` statement should compile the same as `{ expr }`.
32     if true {
33         let _a = Foo{ dropped: false };
34     }
35     // Check that we dropped already (as expected from a `{ expr }`).
36     unsafe { assert!(drop_count == 1); }
37
38     // An `if false {} else { expr }` statement should compile the same as `{ expr }`.
39     if false {
40         panic!();
41     } else {
42         let _a = Foo{ dropped: false };
43     }
44     // Check that we dropped already (as expected from a `{ expr }`).
45     unsafe { assert!(drop_count == 2); }
46 }