aboutsummaryrefslogtreecommitdiff
path: root/test/checkbce.go
diff options
context:
space:
mode:
authorAlexandru Moșoi <brtzsnr@gmail.com>2016-04-04 23:33:30 +0200
committerAlexandru Moșoi <alexandru@mosoi.ro>2016-04-05 12:46:59 +0000
commit1747788c5668e76a238221ae4982daa5bdf24939 (patch)
treedf0bf1a8c760196736c1e5618ccc1e4c5dd7ff40 /test/checkbce.go
parent3bbede0c512ca645fa19522480c0200ee4711bf3 (diff)
downloadgo-1747788c5668e76a238221ae4982daa5bdf24939.tar.gz
go-1747788c5668e76a238221ae4982daa5bdf24939.zip
cmd/compile: add a pass to print bound checks
Since BCE happens over several passes (opt, loopbce, prove) it's easy to regress especially with rewriting. The pass is only activated with special debug flag. Change-Id: I46205982e7a2751156db8e875d69af6138068f59 Reviewed-on: https://go-review.googlesource.com/21510 Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'test/checkbce.go')
-rw-r--r--test/checkbce.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/test/checkbce.go b/test/checkbce.go
new file mode 100644
index 0000000000..a3b0100db8
--- /dev/null
+++ b/test/checkbce.go
@@ -0,0 +1,89 @@
+// +build amd64
+// errorcheck -0 -d=ssa/check_bce/debug=3
+
+package main
+
+func f0(a []int) {
+ a[0] = 1 // ERROR "Found IsInBounds$"
+ a[0] = 1
+ a[6] = 1 // ERROR "Found IsInBounds$"
+ a[6] = 1
+ a[5] = 1
+ a[5] = 1
+}
+
+func f1(a [256]int, i int) {
+ useInt(a[i]) // ERROR "Found IsInBounds$"
+ useInt(a[i%256]) // ERROR "Found IsInBounds$"
+ useInt(a[i&255])
+ useInt(a[i&17])
+
+ if 4 <= i && i < len(a) {
+ useInt(a[i])
+ useInt(a[i-1]) // ERROR "Found IsInBounds$"
+ useInt(a[i-4]) // ERROR "Found IsInBounds$"
+ }
+}
+
+func f2(a [256]int, i uint) {
+ useInt(a[i]) // ERROR "Found IsInBounds$"
+ useInt(a[i%256])
+ useInt(a[i&255])
+ useInt(a[i&17])
+}
+
+func f3(a [256]int, i uint8) {
+ useInt(a[i])
+ useInt(a[i+10])
+ useInt(a[i+14])
+}
+
+func f4(a [27]int, i uint8) {
+ useInt(a[i%15])
+ useInt(a[i%19])
+ useInt(a[i%27])
+}
+
+func f5(a []int) {
+ if len(a) > 5 {
+ useInt(a[5])
+ useSlice(a[6:])
+ useSlice(a[:6]) // ERROR "Found IsSliceInBounds$"
+ }
+}
+
+func g1(a []int) {
+ for i := range a {
+ a[i] = i
+ useSlice(a[:i+1])
+ useSlice(a[:i])
+ }
+}
+
+func g2(a []int) {
+ useInt(a[3]) // ERROR "Found IsInBounds$"
+ useInt(a[2])
+ useInt(a[1])
+ useInt(a[0])
+}
+
+func g3(a []int) {
+ for i := range a[:256] { // ERROR "Found IsSliceInBounds$"
+ useInt(a[i]) // ERROR "Found IsInBounds$"
+ }
+ b := a[:256]
+ for i := range b {
+ useInt(b[i])
+ }
+}
+
+//go:noinline
+func useInt(a int) {
+}
+
+//go:noinline
+func useSlice(a []int) {
+}
+
+func main() {
+}