aboutsummaryrefslogtreecommitdiff
path: root/src/test/run-pass
diff options
context:
space:
mode:
authorJeffrey Yasskin <[email protected]>2010-07-13 15:22:50 +0800
committerGraydon Hoare <[email protected]>2010-07-16 08:13:08 +0800
commitb3ca7522bb2fb93fcc053dbf9fe757a6c02dc9f2 (patch)
treebd5357629c61d2b72163202a6396c2ee52b1bb2a /src/test/run-pass
parentInitial test that the compiler runs destructors in the right order. (diff)
downloadrust-b3ca7522bb2fb93fcc053dbf9fe757a6c02dc9f2.tar.xz
rust-b3ca7522bb2fb93fcc053dbf9fe757a6c02dc9f2.zip
More destruction ordering tests.
Diffstat (limited to 'src/test/run-pass')
-rw-r--r--src/test/run-pass/destructor-ordering.rs54
1 files changed, 52 insertions, 2 deletions
diff --git a/src/test/run-pass/destructor-ordering.rs b/src/test/run-pass/destructor-ordering.rs
index e00966f1..99479c55 100644
--- a/src/test/run-pass/destructor-ordering.rs
+++ b/src/test/run-pass/destructor-ordering.rs
@@ -22,8 +22,58 @@ obj dorder(@order_tracker tracker, int order, str message) {
}
}
-fn main() {
+fn test_simple() {
auto tracker = @order_tracker(0);
dorder(tracker, 1, "Reverse decl order");
dorder(tracker, 0, "Reverse decl order");
-} \ No newline at end of file
+}
+
+fn test_block() {
+ auto tracker = @order_tracker(0);
+ dorder(tracker, 2, "Before block");
+ {
+ dorder(tracker, 0, "Inside block");
+ }
+ dorder(tracker, 1, "After block");
+}
+
+fn test_decl_v_init() {
+ auto tracker = @order_tracker(0);
+ auto var1;
+ auto var2;
+ var2 = dorder(tracker, 0, "decl, not init");
+ var1 = dorder(tracker, 1, "decl, not init");
+}
+
+fn test_overwritten_obj() {
+ auto tracker = @order_tracker(0);
+ auto var1 = dorder(tracker, 0, "overwritten object destroyed first");
+ auto var2 = dorder(tracker, 2, "destroyed at end of scope");
+ var1 = dorder(tracker, 3, "overwriter deleted in rev decl order");
+ {
+ dorder(tracker, 1, "overwritten object destroyed before end of scope");
+ }
+}
+
+// Used to embed dorder objects into an expression. Note that the
+// parameters don't get destroyed.
+fn combine_dorders(dorder d1, dorder d2) -> int {
+ ret 1;
+}
+fn test_expression_destroyed_right_to_left() {
+ auto tracker = @order_tracker(0);
+ combine_dorders(dorder(tracker, 4, ""), dorder(tracker, 3, ""))
+ / combine_dorders(dorder(tracker, 2, ""), dorder(tracker, 1, ""));
+ {
+ dorder(tracker, 0,
+ "expression objects live to end of block, not statement");
+ }
+}
+
+fn main() {
+ test_simple();
+ test_block();
+ test_decl_v_init();
+ test_overwritten_obj();
+ test_expression_destroyed_right_to_left();
+}