aboutsummaryrefslogtreecommitdiff
path: root/compiler/tests/verifier/special_pointers.good
blob: 704363d29ded17750e49248a2fbd84e6ead159ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

int i;
int#[3] arr;

int^   normal_const1    = @i;
int+>  flexi_const1     = @arr#[0];
int*>  raw_const1       = @i;
int+*> rawflexi_const1  = @arr#[0];

int var^   normal1      = @i;
int var+>  flexi1       = @arr#[0];
int var*>  raw1         = @i;
int var+*> rawflexi1    = @arr#[0];

// This is allowed (but *>? is not)
int+>? allowed;


() test()
{
    int^   normal_const2    = @i;
    int+>  flexi_const2     = @arr#[0];
    int*>  raw_const2       = @i;
    int+*> rawflexi_const2  = @arr#[0];
    
    int var^   normal2      = @i;
    int var+>  flexi2       = @arr#[0];
    int var*>  raw2         = @i;
    int var+*> rawflexi2    = @arr#[0];
    
    int var^? optptr;
    var int j;
    
    j = normal1^;
    j = normal2^;
    j = flexi1^;
    j = flexi2^;
    j = raw1^;
    j = raw2^;
    j = rawflexi1^;
    j = rawflexi2^;
    
    rawflexi1 = normal1;
    normal1 = rawflexi1;
    
    // TODO implement arithmetic operators for flexi pointers?
    /*flexi1 += 1;
    flexi2 += 1;
    rawflexi1 += 1;
    rawflexi2 += 1;*/
    
    j = flexi1#[1];
    j = flexi2#[1];
    j = rawflexi1#[1];
    j = rawflexi2#[1];
    flexi1 = @flexi1#[1];
    flexi2 = @flexi2#[1];
    rawflexi1 = @rawflexi1#[1];
    rawflexi2 = @rawflexi2#[1];
    
    raw1 = none;
    raw2 = none;
    rawflexi1 = none;
    rawflexi2 = none;
    
    optptr = raw1;
    optptr = raw2;
    optptr = rawflexi1;
    optptr = rawflexi2;
    raw1 = optptr;
    raw2 = optptr;
    rawflexi1 = optptr;
    rawflexi2 = optptr;
}