More destruction ordering tests.

This commit is contained in:
Jeffrey Yasskin 2010-07-13 15:22:50 +08:00 committed by Graydon Hoare
parent 7dd464fdb5
commit b3ca7522bb

View File

@ -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");
}
}
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();
}