blob: 857cf2442b64ee026301b13b51178e95be4fe923 [file] [log] [blame]
Alexandru Moșoib91cc532016-03-02 12:58:27 +01001// +build amd64
2// errorcheck -0 -d=ssa/loopbce/debug=3
3
4package main
5
6func f0a(a []int) int {
7 x := 0
8 for i := range a { // ERROR "Induction variable with minimum 0 and increment 1$"
9 x += a[i] // ERROR "Found redundant IsInBounds$"
10 }
11 return x
12}
13
14func f0b(a []int) int {
15 x := 0
16 for i := range a { // ERROR "Induction variable with minimum 0 and increment 1$"
17 b := a[i:] // ERROR "Found redundant IsSliceInBounds$"
18 x += b[0]
19 }
20 return x
21}
22
23func f0c(a []int) int {
24 x := 0
25 for i := range a { // ERROR "Induction variable with minimum 0 and increment 1$"
26 b := a[:i+1] // ERROR "Found redundant IsSliceInBounds \(len promoted to cap\)$"
27 x += b[0]
28 }
29 return x
30}
31
32func f1(a []int) int {
33 x := 0
David Chase0b6fbaa2017-06-21 17:19:24 -040034 for _, i := range a { // ERROR "Induction variable with minimum 0 and increment 1"
Alexandru Moșoib91cc532016-03-02 12:58:27 +010035 x += i
36 }
37 return x
38}
39
40func f2(a []int) int {
41 x := 0
42 for i := 1; i < len(a); i++ { // ERROR "Induction variable with minimum 1 and increment 1$"
43 x += a[i] // ERROR "Found redundant IsInBounds$"
44 }
45 return x
46}
47
48func f4(a [10]int) int {
49 x := 0
50 for i := 0; i < len(a); i += 2 { // ERROR "Induction variable with minimum 0 and increment 2$"
51 x += a[i] // ERROR "Found redundant IsInBounds$"
52 }
53 return x
54}
55
56func f5(a [10]int) int {
57 x := 0
58 for i := -10; i < len(a); i += 2 { // ERROR "Induction variable with minimum -10 and increment 2$"
59 x += a[i]
60 }
61 return x
62}
63
64func f6(a []int) {
65 for i := range a { // ERROR "Induction variable with minimum 0 and increment 1$"
66 b := a[0:i] // ERROR "Found redundant IsSliceInBounds \(len promoted to cap\)$"
67 f6(b)
68 }
69}
70
71func g0a(a string) int {
72 x := 0
73 for i := 0; i < len(a); i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
74 x += int(a[i]) // ERROR "Found redundant IsInBounds$"
75 }
76 return x
77}
78
79func g0b(a string) int {
80 x := 0
81 for i := 0; len(a) > i; i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
82 x += int(a[i]) // ERROR "Found redundant IsInBounds$"
83 }
84 return x
85}
86
87func g1() int {
88 a := "evenlength"
89 x := 0
90 for i := 0; i < len(a); i += 2 { // ERROR "Induction variable with minimum 0 and increment 2$"
91 x += int(a[i]) // ERROR "Found redundant IsInBounds$"
92 }
93 return x
94}
95
96func g2() int {
97 a := "evenlength"
98 x := 0
99 for i := 0; i < len(a); i += 2 { // ERROR "Induction variable with minimum 0 and increment 2$"
100 j := i
101 if a[i] == 'e' { // ERROR "Found redundant IsInBounds$"
102 j = j + 1
103 }
104 x += int(a[j])
105 }
106 return x
107}
108
109func g3a() {
110 a := "this string has length 25"
111 for i := 0; i < len(a); i += 5 { // ERROR "Induction variable with minimum 0 and increment 5$"
112 useString(a[i:]) // ERROR "Found redundant IsSliceInBounds$"
113 useString(a[:i+3])
114 }
115}
116
117func g3b(a string) {
118 for i := 0; i < len(a); i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
119 useString(a[i+1:]) // ERROR "Found redundant IsSliceInBounds$"
120 }
121}
122
123func g3c(a string) {
124 for i := 0; i < len(a); i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
125 useString(a[:i+1]) // ERROR "Found redundant IsSliceInBounds$"
126 }
127}
128
129func h1(a []byte) {
130 c := a[:128]
131 for i := range c { // ERROR "Induction variable with minimum 0 and increment 1$"
132 c[i] = byte(i) // ERROR "Found redundant IsInBounds$"
133 }
134}
135
136func h2(a []byte) {
137 for i := range a[:128] { // ERROR "Induction variable with minimum 0 and increment 1$"
138 a[i] = byte(i)
139 }
140}
141
Alexandru Moșoi6c6089b2016-04-01 15:09:19 +0200142func k0(a [100]int) [100]int {
143 for i := 10; i < 90; i++ { // ERROR "Induction variable with minimum 10 and increment 1$"
144 a[i-11] = i
145 a[i-10] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 80$"
146 a[i-5] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 85$"
147 a[i] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 90$"
148 a[i+5] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 95$"
149 a[i+10] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 100$"
150 a[i+11] = i
151 }
152 return a
153}
154
155func k1(a [100]int) [100]int {
156 for i := 10; i < 90; i++ { // ERROR "Induction variable with minimum 10 and increment 1$"
157 useSlice(a[:i-11])
158 useSlice(a[:i-10]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 80$"
159 useSlice(a[:i-5]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 85$"
160 useSlice(a[:i]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 90$"
161 useSlice(a[:i+5]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 95$"
162 useSlice(a[:i+10]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 100$"
163 useSlice(a[:i+11]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 101$"
164
165 }
166 return a
167}
168
169func k2(a [100]int) [100]int {
170 for i := 10; i < 90; i++ { // ERROR "Induction variable with minimum 10 and increment 1$"
171 useSlice(a[i-11:])
172 useSlice(a[i-10:]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 80$"
173 useSlice(a[i-5:]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 85$"
174 useSlice(a[i:]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 90$"
175 useSlice(a[i+5:]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 95$"
176 useSlice(a[i+10:]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 100$"
177 useSlice(a[i+11:]) // ERROR "Found redundant \(IsSliceInBounds ind 100\), ind < 101$"
178 }
179 return a
180}
181
182func k3(a [100]int) [100]int {
183 for i := -10; i < 90; i++ { // ERROR "Induction variable with minimum -10 and increment 1$"
184 a[i+10] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 100$"
185 }
186 return a
187}
188
189func k4(a [100]int) [100]int {
190 min := (-1) << 63
191 for i := min; i < min+50; i++ { // ERROR "Induction variable with minimum -9223372036854775808 and increment 1$"
192 a[i-min] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 50$"
193 }
194 return a
195}
196
197func k5(a [100]int) [100]int {
198 max := (1 << 63) - 1
199 for i := max - 50; i < max; i++ { // ERROR "Induction variable with minimum 9223372036854775757 and increment 1$"
philhofer379567a2017-02-20 08:43:54 -0800200 a[i-max+50] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 50$"
Alexandru Moșoi6c6089b2016-04-01 15:09:19 +0200201 a[i-(max-70)] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 70$"
202 }
203 return a
204}
205
Alexandru Moșoib91cc532016-03-02 12:58:27 +0100206func nobce1() {
207 // tests overflow of max-min
208 a := int64(9223372036854774057)
209 b := int64(-1547)
210 z := int64(1337)
211
212 if a%z == b%z {
213 panic("invalid test: modulos should differ")
214 }
215
216 for i := b; i < a; i += z {
217 // No induction variable is possible because i will overflow a first iteration.
218 useString("foobar")
219 }
220}
221
222func nobce2(a string) {
223 for i := int64(0); i < int64(len(a)); i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
224 useString(a[i:]) // ERROR "Found redundant IsSliceInBounds$"
225 }
226 for i := int64(0); i < int64(len(a))-31337; i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
227 useString(a[i:]) // ERROR "Found redundant IsSliceInBounds$"
228 }
229 for i := int64(0); i < int64(len(a))+int64(-1<<63); i++ { // ERROR "Induction variable with minimum 0 and increment 1$"
230 // tests an overflow of StringLen-MinInt64
231 useString(a[i:])
232 }
233}
234
Alexandru Moșoi6c6089b2016-04-01 15:09:19 +0200235func nobce3(a [100]int64) [100]int64 {
236 min := int64((-1) << 63)
237 max := int64((1 << 63) - 1)
238 for i := min; i < max; i++ { // ERROR "Induction variable with minimum -9223372036854775808 and increment 1$"
239 a[i] = i
240 }
241 return a
242}
243
Alexandru Moșoib91cc532016-03-02 12:58:27 +0100244//go:noinline
245func useString(a string) {
246}
247
Alexandru Moșoi6c6089b2016-04-01 15:09:19 +0200248//go:noinline
249func useSlice(a []int) {
250}
251
Alexandru Moșoib91cc532016-03-02 12:58:27 +0100252func main() {
253}