1    private@
2    
3    type A @move =
4        let mut x : i32
5        def f = x * 2
6    
7    do
8        let a1 = A 1
9        assert a1.f == 2
10   
11   do
12       let a1 = A 1
13       let a2 = a1
14       let a3 = a1@copy
15   
16       a1.x = 9
17   
18       assert a2.x == 9
19       assert a3.x == 1
20   
21   type B @move =
22       let a = A 5
23   
24   do
25       let b1 = B.new
26       assert b1.a.f == 10
27   
28   do
29       let b1 = B.new
30       let a2 = b1.a
31       let a3 = b1.a@copy
32   
33       b1.a.x = 9
34   
35       assert a2.x == 9
36       assert a3.x == 5
37   
38   do
39       let a1 = A@ref 9
40       assert a1.x == 9
41       assert a1.f == 18
42   
43   do
44       let g (u : mem A) (v : i32) =
45           assert u.x == v
46   
47       let a1 = A 9
48       let b1 = B.new
49   
50       g a1@copy 9
51       g b1.a@copy 5
52   
53   type Inner @move =
54       let x : i32
55   
56   type Outer =
57       let inner = Inner 5
58   
59   do
60       let outer = Outer.new
61       assert outer.inner.x == 5
62   
63   type OuterMove @move =
64       let inner = Inner 9
65   
66   do
67       let outer = OuterMove.new
68       assert outer.inner.x == 9
69