| //@ run-pass |
| #![allow(unused_must_use)] |
| // Test that we are able to reinitialize box with moved referent |
| // FIXME(static_mut_refs): Do not allow `static_mut_refs` lint |
| #![allow(static_mut_refs)] |
| |
| static mut ORDER: [usize; 3] = [0, 0, 0]; |
| static mut INDEX: usize = 0; |
| |
| struct Dropee (usize); |
| |
| impl Drop for Dropee { |
| fn drop(&mut self) { |
| unsafe { |
| ORDER[INDEX] = self.0; |
| INDEX = INDEX + 1; |
| } |
| } |
| } |
| |
| fn add_sentintel() { |
| unsafe { |
| ORDER[INDEX] = 2; |
| INDEX = INDEX + 1; |
| } |
| } |
| |
| fn main() { |
| let mut x = Box::new(Dropee(1)); |
| *x; // move out from `*x` |
| add_sentintel(); |
| *x = Dropee(3); // re-initialize `*x` |
| {x}; // drop value |
| unsafe { |
| assert_eq!(ORDER, [1, 2, 3]); |
| } |
| } |