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