diff --git a/src/test/run-fail/mir_dynamic_drops_1.rs b/src/test/run-fail/mir_dynamic_drops_1.rs new file mode 100644 index 00000000000..f3c2eafde24 --- /dev/null +++ b/src/test/run-fail/mir_dynamic_drops_1.rs @@ -0,0 +1,41 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +#![feature(rustc_attrs)] +// error-pattern:drop 1 +// error-pattern:drop 2 +use std::io::{self, Write}; + + +/// Structure which will not allow to be dropped twice. +struct Droppable(bool, u32); +impl Drop for Droppable { + fn drop(&mut self) { + if self.0 { + writeln!(io::stderr(), "{} dropped twice", self.1); + ::std::process::exit(1); + } + writeln!(io::stderr(), "drop {}", self.1); + self.0 = true; + } +} + +#[rustc_mir] +fn mir(){ + let x = Droppable(false, 1); + let y = Droppable(false, 2); + let mut z = x; + let k = y; + z = k; +} + +fn main() { + mir(); + panic!(); +} diff --git a/src/test/run-fail/mir_dynamic_drops_2.rs b/src/test/run-fail/mir_dynamic_drops_2.rs new file mode 100644 index 00000000000..ada04dfce64 --- /dev/null +++ b/src/test/run-fail/mir_dynamic_drops_2.rs @@ -0,0 +1,39 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +#![feature(rustc_attrs)] +// error-pattern:drop 1 +use std::io::{self, Write}; + + +/// Structure which will not allow to be dropped twice. +struct Droppable(bool, u32); +impl Drop for Droppable { + fn drop(&mut self) { + if self.0 { + writeln!(io::stderr(), "{} dropped twice", self.1); + ::std::process::exit(1); + } + writeln!(io::stderr(), "drop {}", self.1); + self.0 = true; + } +} + +#[rustc_mir] +fn mir(d: Droppable){ + loop { + let x = d; + break; + } +} + +fn main() { + mir(Droppable(false, 1)); + panic!(); +} diff --git a/src/test/run-fail/mir_dynamic_drops_3.rs b/src/test/run-fail/mir_dynamic_drops_3.rs new file mode 100644 index 00000000000..cfbfb075954 --- /dev/null +++ b/src/test/run-fail/mir_dynamic_drops_3.rs @@ -0,0 +1,43 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +#![feature(rustc_attrs)] +// error-pattern:unwind happens +// error-pattern:drop 3 +// error-pattern:drop 2 +// error-pattern:drop 1 +use std::io::{self, Write}; + + +/// Structure which will not allow to be dropped twice. +struct Droppable(bool, u32); +impl Drop for Droppable { + fn drop(&mut self) { + if self.0 { + writeln!(io::stderr(), "{} dropped twice", self.1); + ::std::process::exit(1); + } + writeln!(io::stderr(), "drop {}", self.1); + self.0 = true; + } +} + +fn may_panic() -> Droppable { + panic!("unwind happens"); +} + +#[rustc_mir] +fn mir(d: Droppable){ + let y = Droppable(false, 2); + let x = [Droppable(false, 1), y, d, may_panic()]; +} + +fn main() { + mir(Droppable(false, 3)); +}