diff options
| author | Jeffrey Yasskin <[email protected]> | 2010-07-13 15:22:50 +0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-07-16 08:13:08 +0800 |
| commit | b3ca7522bb2fb93fcc053dbf9fe757a6c02dc9f2 (patch) | |
| tree | bd5357629c61d2b72163202a6396c2ee52b1bb2a /src/test/run-pass | |
| parent | Initial test that the compiler runs destructors in the right order. (diff) | |
| download | rust-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.rs | 54 |
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(); +} |