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.
36 // Most things need checks.
61 // Unsigned 8-bit numbers don't need checks for len >= 2⁸.
64 use(a1k[ui8]) // ERROR "index bounds check elided"
65 use(a100k[ui8]) // ERROR "index bounds check elided"
67 use(p1k[ui8]) // ERROR "index bounds check elided"
68 use(p100k[ui8]) // ERROR "index bounds check elided"
78 // Unsigned 16-bit numbers don't need checks for len >= 2¹⁶.
82 use(a100k[ui16]) // ERROR "index bounds check elided"
85 use(p100k[ui16]) // ERROR "index bounds check elided"
119 // Mod truncates the maximum value to one less than the argument,
120 // but signed mod can be negative, so only unsigned mod counts.
131 use(a1k[ui%999]) // ERROR "index bounds check elided"
132 use(a100k[ui%999]) // ERROR "index bounds check elided"
134 use(p1k[ui%999]) // ERROR "index bounds check elided"
135 use(p100k[ui%999]) // ERROR "index bounds check elided"
147 use(a1k[ui%1000]) // ERROR "index bounds check elided"
148 use(a100k[ui%1000]) // ERROR "index bounds check elided"
150 use(p1k[ui%1000]) // ERROR "index bounds check elided"
151 use(p100k[ui%1000]) // ERROR "index bounds check elided"
164 use(a100k[ui%1001]) // ERROR "index bounds check elided"
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.
174 use(a1k[i&999]) // ERROR "index bounds check elided"
175 use(a100k[i&999]) // ERROR "index bounds check elided"
177 use(p1k[i&999]) // ERROR "index bounds check elided"
178 use(p100k[i&999]) // ERROR "index bounds check elided"
182 use(a1k[ui&999]) // ERROR "index bounds check elided"
183 use(a100k[ui&999]) // ERROR "index bounds check elided"
185 use(p1k[ui&999]) // ERROR "index bounds check elided"
186 use(p100k[ui&999]) // ERROR "index bounds check elided"
191 use(a100k[i&1000]) // ERROR "index bounds check elided"
194 use(p100k[i&1000]) // ERROR "index bounds check elided"
199 use(a100k[ui&1000]) // ERROR "index bounds check elided"
202 use(p100k[ui&1000]) // ERROR "index bounds check elided"
204 use(a1[i&^-1]) // ERROR "index bounds check elided"
208 use(a1k[i&^-1]) // ERROR "index bounds check elided"
210 use(a1k[i&^-2]) // ERROR "index bounds check elided"
213 use(a1k[i8&^-128]) // ERROR "index bounds check elided"
214 use(a1k[ui8&^1]) // ERROR "index bounds check elided"
215 use(a1k[ui16&^0xf000])
216 use(a1k[ui16&^0xff00]) // ERROR "index bounds check elided"
218 // Right shift cuts the effective number of bits in the index,
219 // but only for unsigned (signed stays negative).
231 use(a100k[ui32>>22]) // ERROR "index bounds check elided"
234 use(p100k[ui32>>22]) // ERROR "index bounds check elided"
246 use(a1k[ui32>>23]) // ERROR "index bounds check elided"
247 use(a100k[ui32>>23]) // ERROR "index bounds check elided"
249 use(p1k[ui32>>23]) // ERROR "index bounds check elided"
250 use(p100k[ui32>>23]) // ERROR "index bounds check elided"
252 // Division cuts the range like right shift does.