1    private@
2    
3    type A = struct
4        array : [i32; 2]
5    
6        def set_to_indexes @mut =
7            for i = 0 until array.size do
8                array[i] = i as i32
9    
10   do
11       let mut a = A array = [3, 4]
12       a.set_to_indexes
13       assert a.array == [0, 1]
14   
15   do
16       let f (a : mut ref [i32; 2]) =
17           a[1] = 3
18   
19       let mut array = [3, 4]
20       f array@mut_ref
21       assert array == [3, 3]
22   
23   type B = struct
24       u : i32
25       v : u32
26   
27   do
28       let b1 = B u = 2
29                  v = 3
30   
31       let b2 = B u = 2
32                  f@ b1
33   
34       assert b1.v == b2.v
35   
36   do
37       let b = B u = 2
38                 f@ struct@zero
39   
40       assert b.v == 0
41   
42   type C = struct
43       n : i32
44       array : [u32; 3]
45   
46   do
47       let c1 = C n = 2
48                  array = [1, 2, 3]
49   
50       let mut c2 = C n = 2
51                      f@ c1
52   
53       assert c2.array == [1, 2, 3]
54   
55       c2.array = memory@zero
56       assert c2.array[0] == 0
57   
58   do
59       let mut c = C n = 2
60                     f@ struct@zero
61   
62       assert c.n == 2 && c.array[0] == 0
63   
64       c = struct@zero
65       assert c.n == 0
66   
67   do
68       let mut count = 0
69       let f () =
70           count += 1
71           B 1 2
72   
73       let b = B f@ f
74       assert b.v == 2 && count == 1
75   
76   type D<U, V> = struct
77       u : U
78       v : V
79   
80   type<T> D<T, T>
81       def swap @mut =
82           let x = u
83           u = v
84           v = x
85   
86   do
87       let mut d = D<i32, i32> u = 10
88                               v = 20
89       d.swap
90       assert d.u == 20 && d.v == 10
91