@@ -22,8 +22,58 @@ obj dorder(@order_tracker tracker, int order, str message) {
22
22
}
23
23
}
24
24
25
- fn main ( ) {
25
+ fn test_simple ( ) {
26
26
auto tracker = @order_tracker ( 0 ) ;
27
27
dorder ( tracker, 1 , "Reverse decl order" ) ;
28
28
dorder ( tracker, 0 , "Reverse decl order" ) ;
29
- }
29
+ }
30
+
31
+ fn test_block ( ) {
32
+ auto tracker = @order_tracker ( 0 ) ;
33
+ dorder ( tracker, 2 , "Before block" ) ;
34
+ {
35
+ dorder ( tracker, 0 , "Inside block" ) ;
36
+ }
37
+ dorder ( tracker, 1 , "After block" ) ;
38
+ }
39
+
40
+ fn test_decl_v_init ( ) {
41
+ auto tracker = @order_tracker ( 0 ) ;
42
+ auto var1;
43
+ auto var2;
44
+ var2 = dorder ( tracker, 0 , "decl, not init" ) ;
45
+ var1 = dorder ( tracker, 1 , "decl, not init" ) ;
46
+ }
47
+
48
+ fn test_overwritten_obj ( ) {
49
+ auto tracker = @order_tracker ( 0 ) ;
50
+ auto var1 = dorder ( tracker, 0 , "overwritten object destroyed first" ) ;
51
+ auto var2 = dorder ( tracker, 2 , "destroyed at end of scope" ) ;
52
+ var1 = dorder ( tracker, 3 , "overwriter deleted in rev decl order" ) ;
53
+ {
54
+ dorder ( tracker, 1 , "overwritten object destroyed before end of scope" ) ;
55
+ }
56
+ }
57
+
58
+ // Used to embed dorder objects into an expression. Note that the
59
+ // parameters don't get destroyed.
60
+ fn combine_dorders ( dorder d1, dorder d2) -> int {
61
+ ret 1 ;
62
+ }
63
+ fn test_expression_destroyed_right_to_left ( ) {
64
+ auto tracker = @order_tracker ( 0 ) ;
65
+ combine_dorders ( dorder ( tracker, 4 , "" ) , dorder ( tracker, 3 , "" ) )
66
+ / combine_dorders ( dorder ( tracker, 2 , "" ) , dorder ( tracker, 1 , "" ) ) ;
67
+ {
68
+ dorder ( tracker, 0 ,
69
+ "expression objects live to end of block, not statement" ) ;
70
+ }
71
+ }
72
+
73
+ fn main ( ) {
74
+ test_simple ( ) ;
75
+ test_block ( ) ;
76
+ test_decl_v_init ( ) ;
77
+ test_overwritten_obj ( ) ;
78
+ test_expression_destroyed_right_to_left ( ) ;
79
+ }
0 commit comments