ea68758299
This directive isn't automatically set by compiletest or x.py, but can be turned on manually for targets that require it.
48 lines
1.1 KiB
Rust
48 lines
1.1 KiB
Rust
// run-pass
|
|
// needs-unwind
|
|
|
|
#![allow(unused_must_use)]
|
|
#![allow(dead_code)]
|
|
#![allow(unused_variables)]
|
|
// Test cleanup of rvalue temporary that occurs while `box` construction
|
|
// is in progress. This scenario revealed a rather terrible bug. The
|
|
// ingredients are:
|
|
//
|
|
// 1. Partial cleanup of `box` is in scope,
|
|
// 2. cleanup of return value from `get_bar()` is in scope,
|
|
// 3. do_it() panics.
|
|
//
|
|
// This led to a bug because `the top-most frame that was to be
|
|
// cleaned (which happens to be the partial cleanup of `box`) required
|
|
// multiple basic blocks, which led to us dropping part of the cleanup
|
|
// from the top-most frame.
|
|
//
|
|
// It's unclear how likely such a bug is to recur, but it seems like a
|
|
// scenario worth testing.
|
|
|
|
// ignore-emscripten no threads support
|
|
|
|
use std::thread;
|
|
|
|
enum Conzabble {
|
|
Bickwick(Foo)
|
|
}
|
|
|
|
struct Foo { field: Box<usize> }
|
|
|
|
fn do_it(x: &[usize]) -> Foo {
|
|
panic!()
|
|
}
|
|
|
|
fn get_bar(x: usize) -> Vec<usize> { vec![x * 2] }
|
|
|
|
pub fn fails() {
|
|
let x = 2;
|
|
let mut y: Vec<Box<_>> = Vec::new();
|
|
y.push(Box::new(Conzabble::Bickwick(do_it(&get_bar(x)))));
|
|
}
|
|
|
|
pub fn main() {
|
|
thread::spawn(fails).join();
|
|
}
|