Home | History | Annotate | Download | only in test
      1 // +build amd64
      2 // errorcheck -0 -d=ssa/loopbce/debug=3
      3 
      4 package main
      5 
      6 func 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 
     14 func 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 
     23 func 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 
     32 func f1(a []int) int {
     33 	x := 0
     34 	for _, i := range a { // ERROR "Induction variable with minimum 0 and increment 1"
     35 		x += i
     36 	}
     37 	return x
     38 }
     39 
     40 func 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 
     48 func 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 
     56 func 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 
     64 func 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 
     71 func 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 
     79 func 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 
     87 func 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 
     96 func 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 
    109 func 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 
    117 func 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 
    123 func 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 
    129 func 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 
    136 func 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 
    142 func 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 
    155 func 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 
    169 func 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 
    182 func 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 
    189 func 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 
    197 func 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$"
    200 		a[i-max+50] = i   // ERROR "Found redundant \(IsInBounds ind 100\), ind < 50$"
    201 		a[i-(max-70)] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 70$"
    202 	}
    203 	return a
    204 }
    205 
    206 func 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 
    222 func 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 
    235 func 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 
    244 //go:noinline
    245 func useString(a string) {
    246 }
    247 
    248 //go:noinline
    249 func useSlice(a []int) {
    250 }
    251 
    252 func main() {
    253 }
    254