From 1af8663579c0e0eb08fda29df51d0eefb2e2b6de Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Fri, 4 Jul 2014 17:55:51 -0700 Subject: librustc: Make sure to run destructors in the right order when matching on moved value. --- src/test/run-pass/order-drop-with-match.rs | 64 ++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/test/run-pass/order-drop-with-match.rs (limited to 'src/test') 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 or the MIT license +// , 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()); + } +} -- cgit 1.4.1-3-g733a5