v2 / vlib / v / tests / testdata / test_array_bound.v
149 lines · 128 sloc · 2.11 KB · fbb9e65c0f25de412ce4f3978422f59b747e463b
Raw
1enum Index {
2 one
3 two
4}
5
6fn direct(b u8) bool {
7 return true
8}
9
10fn access(b u8) bool {
11 return false
12}
13
14fn check_underscore(a []u8) {
15 _ = a[1]
16 direct(a[0])
17}
18
19fn check_fn(a []u8) {
20 access(a[2])
21 direct(a[2])
22 direct(a[1])
23}
24
25fn check_if_access(a []u8) {
26 access(a[3])
27 if a[3] == `0` {
28 }
29}
30
31fn check_if_fn_access(a []u8) {
32 access(a[4])
33 if direct(a[4]) {
34 direct(a[4])
35 }
36}
37
38fn check_if_test_in_branch(a []u8) {
39 if a[6] == `0` {
40 direct(a[5])
41 access(a[7])
42 }
43}
44
45fn check_if_fn_branch(a []u8) {
46 if access(a[8]) {
47 direct(a[7])
48 }
49}
50
51fn check_for_branch(a []u8) {
52 access(a[9])
53 for _ in 0 .. 1 {
54 access(a[10])
55 }
56 direct(a[9])
57 access(a[10])
58}
59
60fn check_assert(a []u8) {
61 assert a.len >= 19
62 direct(a[18])
63
64 assert 21 <= a.len
65 _ = a[20]
66}
67
68fn check_range_access(a []u8) {
69 access(a[23])
70 range := a[20..25]
71 direct(range[3])
72 access(range[4])
73 direct(range[4])
74}
75
76fn check_for(a []u8) {
77 for access(a[30]) == false {
78 direct(a[30])
79 access(a[31])
80 return
81 }
82}
83
84fn check_for_c_init_0(a []u8) {
85 for a[32] == 0 {
86 direct(a[32])
87 access(a[33])
88 return
89 }
90}
91
92fn check_for_c_init_1(a []u8) {
93 for access_it := a[34]; a[34] == 0; {
94 direct(a[34])
95 access(a[35])
96 // work around https://github.com/vlang/v/issues/12832
97 println(access_it)
98 return
99 }
100}
101
102// fn check_for_c_init_2(a []u8) {
103// mut run := true
104// for x := a[36]; a[36] == 0 && run; x = a[38] {
105// direct(a[36])
106// access(a[37])
107// run = false
108// }
109// direct(a[38])
110// }
111
112// fn skip_clone(a []u8) {
113// access(a[30])
114// fn_local := a.clone()
115// direct(fn_local[30])
116// }
117
118// fn skip_mut_self_assign(a []u8) {
119// mut fn_local := a.clone()
120// fn_local[31] = fn_local[32]
121// direct(fn_local[31])
122// }
123
124// fn skip_enum (a []u8) {
125// access(a[33])
126// direct(a[Index.two])
127// }
128
129fn main() {
130 a := []u8{len: 50}
131 direct(a[49])
132
133 check_underscore(a)
134 check_fn(a)
135 check_if_access(a)
136 check_if_fn_access(a)
137 check_if_test_in_branch(a)
138 check_if_fn_branch(a)
139 check_for_branch(a)
140 check_assert(a)
141 check_range_access(a)
142 check_for(a)
143 check_for_c_init_0(a)
144 check_for_c_init_1(a)
145 // check_for_c_init_2(a)
146 // skip_clone(a)
147 // skip_mut_self_assign(a)
148 // skip_enum (a)
149}
150