]> git.lizzy.rs Git - rust.git/blob - src/test/ui/unboxed-closures/unboxed-closures-drop.rs
diagnostics: give a special note for unsafe fn / Fn/FnOnce/FnMut
[rust.git] / src / test / ui / unboxed-closures / unboxed-closures-drop.rs
1 // run-pass
2 #![allow(path_statements)]
3 #![allow(dead_code)]
4 // A battery of tests to ensure destructors of unboxed closure environments
5 // run at the right times.
6
7 static mut DROP_COUNT: usize = 0;
8
9 fn drop_count() -> usize {
10     unsafe {
11         DROP_COUNT
12     }
13 }
14
15 struct Droppable {
16     x: isize,
17 }
18
19 impl Droppable {
20     fn new() -> Droppable {
21         Droppable {
22             x: 1
23         }
24     }
25 }
26
27 impl Drop for Droppable {
28     fn drop(&mut self) {
29         unsafe {
30             DROP_COUNT += 1
31         }
32     }
33 }
34
35 fn a<F:Fn(isize, isize) -> isize>(f: F) -> isize {
36     f(1, 2)
37 }
38
39 fn b<F:FnMut(isize, isize) -> isize>(mut f: F) -> isize {
40     f(3, 4)
41 }
42
43 fn c<F:FnOnce(isize, isize) -> isize>(f: F) -> isize {
44     f(5, 6)
45 }
46
47 fn test_fn() {
48     {
49         a(move |a: isize, b| { a + b });
50     }
51     assert_eq!(drop_count(), 0);
52
53     {
54         let z = &Droppable::new();
55         a(move |a: isize, b| { z; a + b });
56         assert_eq!(drop_count(), 0);
57     }
58     assert_eq!(drop_count(), 1);
59
60     {
61         let z = &Droppable::new();
62         let zz = &Droppable::new();
63         a(move |a: isize, b| { z; zz; a + b });
64         assert_eq!(drop_count(), 1);
65     }
66     assert_eq!(drop_count(), 3);
67 }
68
69 fn test_fn_mut() {
70     {
71         b(move |a: isize, b| { a + b });
72     }
73     assert_eq!(drop_count(), 3);
74
75     {
76         let z = &Droppable::new();
77         b(move |a: isize, b| { z; a + b });
78         assert_eq!(drop_count(), 3);
79     }
80     assert_eq!(drop_count(), 4);
81
82     {
83         let z = &Droppable::new();
84         let zz = &Droppable::new();
85         b(move |a: isize, b| { z; zz; a + b });
86         assert_eq!(drop_count(), 4);
87     }
88     assert_eq!(drop_count(), 6);
89 }
90
91 fn test_fn_once() {
92     {
93         c(move |a: isize, b| { a + b });
94     }
95     assert_eq!(drop_count(), 6);
96
97     {
98         let z = Droppable::new();
99         c(move |a: isize, b| { z; a + b });
100         assert_eq!(drop_count(), 7);
101     }
102     assert_eq!(drop_count(), 7);
103
104     {
105         let z = Droppable::new();
106         let zz = Droppable::new();
107         c(move |a: isize, b| { z; zz; a + b });
108         assert_eq!(drop_count(), 9);
109     }
110     assert_eq!(drop_count(), 9);
111 }
112
113 fn main() {
114     test_fn();
115     test_fn_mut();
116     test_fn_once();
117 }