diff options
| author | Luqman Aden <me@luqman.ca> | 2014-07-04 17:55:51 -0700 |
|---|---|---|
| committer | Luqman Aden <me@luqman.ca> | 2014-07-04 18:05:09 -0700 |
| commit | 1af8663579c0e0eb08fda29df51d0eefb2e2b6de (patch) | |
| tree | 46cfd40c328977186b3468eb7e556b0a7ce67168 /src/test/run-pass | |
| parent | 5d5c20647f45f2eb74f337e5434bbe63b0c43345 (diff) | |
| download | rust-1af8663579c0e0eb08fda29df51d0eefb2e2b6de.tar.gz rust-1af8663579c0e0eb08fda29df51d0eefb2e2b6de.zip | |
librustc: Make sure to run destructors in the right order when matching on moved value.
Diffstat (limited to 'src/test/run-pass')
| -rw-r--r-- | src/test/run-pass/order-drop-with-match.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/test/run-pass/order-drop-with-match.rs b/src/test/run-pass/order-drop-with-match.rs new file mode 100644 index 00000000000..ed5cff36c8b --- /dev/null +++ b/src/test/run-pass/order-drop-with-match.rs @@ -0,0 +1,64 @@ +// Copyright 2014 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. + + +// Test to make sure the destructors run in the right order. +// Each destructor sets it's tag in the corresponding entry +// in ORDER matching up to when it ran. +// Correct order is: matched, inner, outer + +static mut ORDER: [uint, ..3] = [0, 0, 0]; +static mut INDEX: uint = 0; + +struct A; +impl Drop for A { + fn drop(&mut self) { + unsafe { + ORDER[INDEX] = 1; + INDEX = INDEX + 1; + } + } +} + +struct B; +impl Drop for B { + fn drop(&mut self) { + unsafe { + ORDER[INDEX] = 2; + INDEX = INDEX + 1; + } + } +} + +struct C; +impl Drop for C { + fn drop(&mut self) { + unsafe { + ORDER[INDEX] = 3; + INDEX = INDEX + 1; + } + } +} + +fn main() { + { + let matched = A; + let _outer = C; + { + match matched { + _s => {} + } + let _inner = B; + } + } + unsafe { + assert_eq!(&[1, 2, 3], ORDER.as_slice()); + } +} |
