diff options
author | Giovanni Bajo <rasky@develer.com> | 2018-04-15 23:52:12 +0200 |
---|---|---|
committer | Giovanni Bajo <rasky@develer.com> | 2018-09-02 10:34:51 +0000 |
commit | dd5e9b32ff60f99f993953a74e39d505914c6a56 (patch) | |
tree | fe71161d947c16e8e7916cbd6d0e6b408f9a34b3 /test/checkbce.go | |
parent | f02cc88f46e01c21e550dbf212aefcdad138a91d (diff) | |
download | go-dd5e9b32ff60f99f993953a74e39d505914c6a56.tar.gz go-dd5e9b32ff60f99f993953a74e39d505914c6a56.zip |
cmd/compile: add testcase for #24876
This is still not fixed, the testcase reflects that there are still
a few boundchecks. Let's fix the good alternative with an explicit
test though.
Updates #24876
Change-Id: I4da35eb353e19052bd7b69ea6190a69ced8b9b3d
Reviewed-on: https://go-review.googlesource.com/107355
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Giovanni Bajo <rasky@develer.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'test/checkbce.go')
-rw-r--r-- | test/checkbce.go | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/test/checkbce.go b/test/checkbce.go index 430dcf9cbc..0a2842f10c 100644 --- a/test/checkbce.go +++ b/test/checkbce.go @@ -10,6 +10,8 @@ package main +import "encoding/binary" + func f0(a []int) { a[0] = 1 // ERROR "Found IsInBounds$" a[0] = 1 @@ -142,6 +144,33 @@ func g4(a [100]int) { } } +func decode1(data []byte) (x uint64) { + for len(data) >= 32 { + x += binary.BigEndian.Uint64(data[:8]) + x += binary.BigEndian.Uint64(data[8:16]) + x += binary.BigEndian.Uint64(data[16:24]) + x += binary.BigEndian.Uint64(data[24:32]) + data = data[32:] + } + return x +} + +func decode2(data []byte) (x uint64) { + // TODO(rasky): this should behave like decode1 and compile to no + // boundchecks. We're currently not able to remove all of them. + for len(data) >= 32 { + x += binary.BigEndian.Uint64(data) + data = data[8:] + x += binary.BigEndian.Uint64(data) // ERROR "Found IsInBounds$" + data = data[8:] + x += binary.BigEndian.Uint64(data) // ERROR "Found IsInBounds$" + data = data[8:] + x += binary.BigEndian.Uint64(data) // ERROR "Found IsInBounds$" + data = data[8:] + } + return x +} + //go:noinline func useInt(a int) { } |