[AArch64] SVE tests
[official-gcc.git] / gcc / testsuite / go.test / test / bounds.go
blob50f7ad74196c5376e2cc46d647eaf863164866ce
1 // errorcheck -0 -m -l
3 // Copyright 2012 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // Test, using compiler diagnostic flags, that bounds check elimination
8 // is eliminating the correct checks.
10 package foo
12 var (
13 s []int
15 a1 [1]int
16 a1k [1000]int
17 a100k [100000]int
19 p1 *[1]int
20 p1k *[1000]int
21 p100k *[100000]int
23 i int
24 ui uint
25 i8 int8
26 ui8 uint8
27 i16 int16
28 ui16 uint16
29 i32 int32
30 ui32 uint32
31 i64 int64
32 ui64 uint64
35 func main() {
36 // Most things need checks.
37 use(s[i])
38 use(a1[i])
39 use(a1k[i])
40 use(a100k[i])
41 use(p1[i])
42 use(p1k[i])
43 use(p100k[i])
45 use(s[ui])
46 use(a1[ui])
47 use(a1k[ui])
48 use(a100k[ui])
49 use(p1[ui])
50 use(p1k[ui])
51 use(p100k[ui])
53 use(s[i8])
54 use(a1[i8])
55 use(a1k[i8])
56 use(a100k[i8])
57 use(p1[i8])
58 use(p1k[i8])
59 use(p100k[i8])
61 // Unsigned 8-bit numbers don't need checks for len >= 2⁸.
62 use(s[ui8])
63 use(a1[ui8])
64 use(a1k[ui8]) // ERROR "index bounds check elided"
65 use(a100k[ui8]) // ERROR "index bounds check elided"
66 use(p1[ui8])
67 use(p1k[ui8]) // ERROR "index bounds check elided"
68 use(p100k[ui8]) // ERROR "index bounds check elided"
70 use(s[i16])
71 use(a1[i16])
72 use(a1k[i16])
73 use(a100k[i16])
74 use(p1[i16])
75 use(p1k[i16])
76 use(p100k[i16])
78 // Unsigned 16-bit numbers don't need checks for len >= 2¹⁶.
79 use(s[ui16])
80 use(a1[ui16])
81 use(a1k[ui16])
82 use(a100k[ui16]) // ERROR "index bounds check elided"
83 use(p1[ui16])
84 use(p1k[ui16])
85 use(p100k[ui16]) // ERROR "index bounds check elided"
87 use(s[i32])
88 use(a1[i32])
89 use(a1k[i32])
90 use(a100k[i32])
91 use(p1[i32])
92 use(p1k[i32])
93 use(p100k[i32])
95 use(s[ui32])
96 use(a1[ui32])
97 use(a1k[ui32])
98 use(a100k[ui32])
99 use(p1[ui32])
100 use(p1k[ui32])
101 use(p100k[ui32])
103 use(s[i64])
104 use(a1[i64])
105 use(a1k[i64])
106 use(a100k[i64])
107 use(p1[i64])
108 use(p1k[i64])
109 use(p100k[i64])
111 use(s[ui64])
112 use(a1[ui64])
113 use(a1k[ui64])
114 use(a100k[ui64])
115 use(p1[ui64])
116 use(p1k[ui64])
117 use(p100k[ui64])
119 // Mod truncates the maximum value to one less than the argument,
120 // but signed mod can be negative, so only unsigned mod counts.
121 use(s[i%999])
122 use(a1[i%999])
123 use(a1k[i%999])
124 use(a100k[i%999])
125 use(p1[i%999])
126 use(p1k[i%999])
127 use(p100k[i%999])
129 use(s[ui%999])
130 use(a1[ui%999])
131 use(a1k[ui%999]) // ERROR "index bounds check elided"
132 use(a100k[ui%999]) // ERROR "index bounds check elided"
133 use(p1[ui%999])
134 use(p1k[ui%999]) // ERROR "index bounds check elided"
135 use(p100k[ui%999]) // ERROR "index bounds check elided"
137 use(s[i%1000])
138 use(a1[i%1000])
139 use(a1k[i%1000])
140 use(a100k[i%1000])
141 use(p1[i%1000])
142 use(p1k[i%1000])
143 use(p100k[i%1000])
145 use(s[ui%1000])
146 use(a1[ui%1000])
147 use(a1k[ui%1000]) // ERROR "index bounds check elided"
148 use(a100k[ui%1000]) // ERROR "index bounds check elided"
149 use(p1[ui%1000])
150 use(p1k[ui%1000]) // ERROR "index bounds check elided"
151 use(p100k[ui%1000]) // ERROR "index bounds check elided"
153 use(s[i%1001])
154 use(a1[i%1001])
155 use(a1k[i%1001])
156 use(a100k[i%1001])
157 use(p1[i%1001])
158 use(p1k[i%1001])
159 use(p100k[i%1001])
161 use(s[ui%1001])
162 use(a1[ui%1001])
163 use(a1k[ui%1001])
164 use(a100k[ui%1001]) // ERROR "index bounds check elided"
165 use(p1[ui%1001])
166 use(p1k[ui%1001])
167 use(p100k[ui%1001]) // ERROR "index bounds check elided"
169 // Bitwise and truncates the maximum value to the mask value.
170 // The result (for a positive mask) cannot be negative, so elision
171 // applies to both signed and unsigned indexes.
172 use(s[i&999])
173 use(a1[i&999])
174 use(a1k[i&999]) // ERROR "index bounds check elided"
175 use(a100k[i&999]) // ERROR "index bounds check elided"
176 use(p1[i&999])
177 use(p1k[i&999]) // ERROR "index bounds check elided"
178 use(p100k[i&999]) // ERROR "index bounds check elided"
180 use(s[ui&999])
181 use(a1[ui&999])
182 use(a1k[ui&999]) // ERROR "index bounds check elided"
183 use(a100k[ui&999]) // ERROR "index bounds check elided"
184 use(p1[ui&999])
185 use(p1k[ui&999]) // ERROR "index bounds check elided"
186 use(p100k[ui&999]) // ERROR "index bounds check elided"
188 use(s[i&1000])
189 use(a1[i&1000])
190 use(a1k[i&1000])
191 use(a100k[i&1000]) // ERROR "index bounds check elided"
192 use(p1[i&1000])
193 use(p1k[i&1000])
194 use(p100k[i&1000]) // ERROR "index bounds check elided"
196 use(s[ui&1000])
197 use(a1[ui&1000])
198 use(a1k[ui&1000])
199 use(a100k[ui&1000]) // ERROR "index bounds check elided"
200 use(p1[ui&1000])
201 use(p1k[ui&1000])
202 use(p100k[ui&1000]) // ERROR "index bounds check elided"
204 // Right shift cuts the effective number of bits in the index,
205 // but only for unsigned (signed stays negative).
206 use(s[i32>>22])
207 use(a1[i32>>22])
208 use(a1k[i32>>22])
209 use(a100k[i32>>22])
210 use(p1[i32>>22])
211 use(p1k[i32>>22])
212 use(p100k[i32>>22])
214 use(s[ui32>>22])
215 use(a1[ui32>>22])
216 use(a1k[ui32>>22])
217 use(a100k[ui32>>22]) // ERROR "index bounds check elided"
218 use(p1[ui32>>22])
219 use(p1k[ui32>>22])
220 use(p100k[ui32>>22]) // ERROR "index bounds check elided"
222 use(s[i32>>23])
223 use(a1[i32>>23])
224 use(a1k[i32>>23])
225 use(a100k[i32>>23])
226 use(p1[i32>>23])
227 use(p1k[i32>>23])
228 use(p100k[i32>>23])
230 use(s[ui32>>23])
231 use(a1[ui32>>23])
232 use(a1k[ui32>>23]) // ERROR "index bounds check elided"
233 use(a100k[ui32>>23]) // ERROR "index bounds check elided"
234 use(p1[ui32>>23])
235 use(p1k[ui32>>23]) // ERROR "index bounds check elided"
236 use(p100k[ui32>>23]) // ERROR "index bounds check elided"
238 // Division cuts the range like right shift does.
239 use(s[i/1e6])
240 use(a1[i/1e6])
241 use(a1k[i/1e6])
242 use(a100k[i/1e6])
243 use(p1[i/1e6])
244 use(p1k[i/1e6])
245 use(p100k[i/1e6])
247 use(s[ui/1e6])
248 use(a1[ui/1e6])
249 use(a1k[ui/1e6])
250 use(p1[ui/1e6])
251 use(p1k[ui/1e6])
253 use(s[i/1e7])
254 use(a1[i/1e7])
255 use(a1k[i/1e7])
256 use(a100k[i/1e7])
257 use(p1[i/1e7])
258 use(p1k[i/1e7])
259 use(p100k[i/1e7])
261 use(s[ui/1e7])
262 use(a1[ui/1e7])
263 use(p1[ui/1e7])
266 var sum int
268 func use(x int) {
269 sum += x