diff options
| author | bors <bors@rust-lang.org> | 2016-06-04 23:49:29 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-06-04 23:49:29 -0700 |
| commit | f97c411548f2b64f74f2bcb84dcc37075c05e2a0 (patch) | |
| tree | 78f88d09614f89ea7e955252407bc0da5f02332b /src/test/run-fail | |
| parent | ccfaaa7d989356ff440e9960da28909491e2f00d (diff) | |
| parent | 063f8826e7addbe644e3dfd532736ce72d8990bc (diff) | |
| download | rust-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.rs | 47 |
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); +} |
