about summary refs log tree commit diff
path: root/src/test/run-fail
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-06-04 23:49:29 -0700
committerbors <bors@rust-lang.org>2016-06-04 23:49:29 -0700
commitf97c411548f2b64f74f2bcb84dcc37075c05e2a0 (patch)
tree78f88d09614f89ea7e955252407bc0da5f02332b /src/test/run-fail
parentccfaaa7d989356ff440e9960da28909491e2f00d (diff)
parent063f8826e7addbe644e3dfd532736ce72d8990bc (diff)
downloadrust-f97c411548f2b64f74f2bcb84dcc37075c05e2a0.tar.gz
rust-f97c411548f2b64f74f2bcb84dcc37075c05e2a0.zip
Auto merge of #33622 - arielb1:elaborate-drops, r=nikomatsakis
[MIR] non-zeroing drop

This enables non-zeroing drop through stack flags for MIR.

Fixes #30380.
Fixes #5016.
Diffstat (limited to 'src/test/run-fail')
-rw-r--r--src/test/run-fail/issue-30380.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/test/run-fail/issue-30380.rs b/src/test/run-fail/issue-30380.rs
new file mode 100644
index 00000000000..eb668517bdf
--- /dev/null
+++ b/src/test/run-fail/issue-30380.rs
@@ -0,0 +1,47 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(rustc_attrs)]
+
+// check that panics in destructors during assignment do not leave
+// destroyed values lying around for other destructors to observe.
+
+// error-pattern:panicking destructors ftw!
+
+struct Observer<'a>(&'a mut FilledOnDrop);
+
+struct FilledOnDrop(u32);
+impl Drop for FilledOnDrop {
+    fn drop(&mut self) {
+        if self.0 == 0 {
+            // this is only set during the destructor - safe
+            // code should not be able to observe this.
+            self.0 = 0x1c1c1c1c;
+            panic!("panicking destructors ftw!");
+        }
+    }
+}
+
+impl<'a> Drop for Observer<'a> {
+    fn drop(&mut self) {
+        assert_eq!(self.0 .0, 1);
+    }
+}
+
+#[rustc_mir]
+fn foo(b: &mut Observer) {
+    *b.0 = FilledOnDrop(1);
+}
+
+fn main() {
+    let mut bomb = FilledOnDrop(0);
+    let mut observer = Observer(&mut bomb);
+    foo(&mut observer);
+}