1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
//@ 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]);
}
}
|