|  | //! Regression test for https://github.com/rust-lang/rust/issues/16492 | 
|  |  | 
|  | //@ run-pass | 
|  | #![allow(non_snake_case)] | 
|  |  | 
|  | use std::rc::Rc; | 
|  | use std::cell::Cell; | 
|  |  | 
|  | struct Field { | 
|  | number: usize, | 
|  | state: Rc<Cell<usize>> | 
|  | } | 
|  |  | 
|  | impl Field { | 
|  | fn new(number: usize, state: Rc<Cell<usize>>) -> Field { | 
|  | Field { | 
|  | number: number, | 
|  | state: state | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | impl Drop for Field { | 
|  | fn drop(&mut self) { | 
|  | println!("Dropping field {}", self.number); | 
|  | assert_eq!(self.state.get(), self.number); | 
|  | self.state.set(self.state.get()+1); | 
|  | } | 
|  | } | 
|  |  | 
|  | struct NoDropImpl { | 
|  | _one: Field, | 
|  | _two: Field, | 
|  | _three: Field | 
|  | } | 
|  |  | 
|  | struct HasDropImpl { | 
|  | _one: Field, | 
|  | _two: Field, | 
|  | _three: Field | 
|  | } | 
|  |  | 
|  | impl Drop for HasDropImpl { | 
|  | fn drop(&mut self) { | 
|  | println!("HasDropImpl.drop()"); | 
|  | assert_eq!(self._one.state.get(), 0); | 
|  | self._one.state.set(1); | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn main() { | 
|  | let state = Rc::new(Cell::new(1)); | 
|  | let noImpl = NoDropImpl { | 
|  | _one: Field::new(1, state.clone()), | 
|  | _two: Field::new(2, state.clone()), | 
|  | _three: Field::new(3, state.clone()) | 
|  | }; | 
|  | drop(noImpl); | 
|  | assert_eq!(state.get(), 4); | 
|  |  | 
|  | state.set(0); | 
|  | let hasImpl = HasDropImpl { | 
|  | _one: Field::new(1, state.clone()), | 
|  | _two: Field::new(2, state.clone()), | 
|  | _three: Field::new(3, state.clone()) | 
|  | }; | 
|  | drop(hasImpl); | 
|  | assert_eq!(state.get(), 4); | 
|  | } |