//@ run-pass | |
//@ needs-unwind | |
//@ ignore-emscripten no threads support | |
// Test that if a slicing expr[..] fails, the correct cleanups happen. | |
// FIXME(static_mut_refs): this could use an atomic | |
#![allow(static_mut_refs)] | |
use std::thread; | |
struct Foo; | |
static mut DTOR_COUNT: isize = 0; | |
impl Drop for Foo { | |
fn drop(&mut self) { unsafe { DTOR_COUNT += 1; } } | |
} | |
fn foo() { | |
let x: &[_] = &[Foo, Foo]; | |
let _ = &x[3..4]; | |
} | |
fn main() { | |
let _ = thread::spawn(move|| foo()).join(); | |
unsafe { assert_eq!(DTOR_COUNT, 2); } | |
} |