2 #![allow(path_statements)]
4 // A battery of tests to ensure destructors of unboxed closure environments
5 // run at the right times.
7 static mut DROP_COUNT: usize = 0;
9 fn drop_count() -> usize {
20 fn new() -> Droppable {
27 impl Drop for Droppable {
35 fn a<F:Fn(isize, isize) -> isize>(f: F) -> isize {
39 fn b<F:FnMut(isize, isize) -> isize>(mut f: F) -> isize {
43 fn c<F:FnOnce(isize, isize) -> isize>(f: F) -> isize {
49 a(move |a: isize, b| { a + b });
51 assert_eq!(drop_count(), 0);
54 let z = &Droppable::new();
55 a(move |a: isize, b| { z; a + b });
56 assert_eq!(drop_count(), 0);
58 assert_eq!(drop_count(), 1);
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);
66 assert_eq!(drop_count(), 3);
71 b(move |a: isize, b| { a + b });
73 assert_eq!(drop_count(), 3);
76 let z = &Droppable::new();
77 b(move |a: isize, b| { z; a + b });
78 assert_eq!(drop_count(), 3);
80 assert_eq!(drop_count(), 4);
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);
88 assert_eq!(drop_count(), 6);
93 c(move |a: isize, b| { a + b });
95 assert_eq!(drop_count(), 6);
98 let z = Droppable::new();
99 c(move |a: isize, b| { z; a + b });
100 assert_eq!(drop_count(), 7);
102 assert_eq!(drop_count(), 7);
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);
110 assert_eq!(drop_count(), 9);