]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/issue-38437.rs
Remove the in-tree `flate` crate
[rust.git] / src / test / run-pass / issue-38437.rs
1 // Copyright 2016 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 // Check that drop elaboration clears the "master" discriminant
12 // drop flag even if it protects no fields.
13
14 struct Good(usize);
15 impl Drop for Good {
16     #[inline(never)]
17     fn drop(&mut self) {
18         println!("dropping Good({})", self.0);
19     }
20 }
21
22 struct Void;
23 impl Drop for Void {
24     #[inline(never)]
25     fn drop(&mut self) {
26         panic!("Suddenly, a Void appears.");
27     }
28 }
29
30 enum E {
31     Never(Void),
32     Fine(Good)
33 }
34
35 fn main() {
36     let mut go = true;
37
38     loop {
39         let next;
40         match go {
41             true => next = E::Fine(Good(123)),
42             false => return,
43         }
44
45         match next {
46             E::Never(_) => return,
47             E::Fine(_good) => go = false,
48         }
49
50         // `next` is dropped and StorageDead'd here. We must reset the
51         // discriminant's drop flag to avoid random variants being
52         // dropped.
53     }
54 }