]> Cypherpunks.ru repositories - gostls13.git/blob - test/checkbce.go
cmd/compile: add a pass to print bound checks
[gostls13.git] / test / checkbce.go
1 // +build amd64
2 // errorcheck -0 -d=ssa/check_bce/debug=3
3
4 package main
5
6 func f0(a []int) {
7         a[0] = 1 // ERROR "Found IsInBounds$"
8         a[0] = 1
9         a[6] = 1 // ERROR "Found IsInBounds$"
10         a[6] = 1
11         a[5] = 1
12         a[5] = 1
13 }
14
15 func f1(a [256]int, i int) {
16         useInt(a[i])     // ERROR "Found IsInBounds$"
17         useInt(a[i%256]) // ERROR "Found IsInBounds$"
18         useInt(a[i&255])
19         useInt(a[i&17])
20
21         if 4 <= i && i < len(a) {
22                 useInt(a[i])
23                 useInt(a[i-1]) // ERROR "Found IsInBounds$"
24                 useInt(a[i-4]) // ERROR "Found IsInBounds$"
25         }
26 }
27
28 func f2(a [256]int, i uint) {
29         useInt(a[i]) // ERROR "Found IsInBounds$"
30         useInt(a[i%256])
31         useInt(a[i&255])
32         useInt(a[i&17])
33 }
34
35 func f3(a [256]int, i uint8) {
36         useInt(a[i])
37         useInt(a[i+10])
38         useInt(a[i+14])
39 }
40
41 func f4(a [27]int, i uint8) {
42         useInt(a[i%15])
43         useInt(a[i%19])
44         useInt(a[i%27])
45 }
46
47 func f5(a []int) {
48         if len(a) > 5 {
49                 useInt(a[5])
50                 useSlice(a[6:])
51                 useSlice(a[:6]) // ERROR "Found IsSliceInBounds$"
52         }
53 }
54
55 func g1(a []int) {
56         for i := range a {
57                 a[i] = i
58                 useSlice(a[:i+1])
59                 useSlice(a[:i])
60         }
61 }
62
63 func g2(a []int) {
64         useInt(a[3]) // ERROR "Found IsInBounds$"
65         useInt(a[2])
66         useInt(a[1])
67         useInt(a[0])
68 }
69
70 func g3(a []int) {
71         for i := range a[:256] { // ERROR "Found IsSliceInBounds$"
72                 useInt(a[i]) // ERROR "Found IsInBounds$"
73         }
74         b := a[:256]
75         for i := range b {
76                 useInt(b[i])
77         }
78 }
79
80 //go:noinline
81 func useInt(a int) {
82 }
83
84 //go:noinline
85 func useSlice(a []int) {
86 }
87
88 func main() {
89 }