test: fix bcecheck test on noopt builder

The noopt builder is configured by setting GO_GCFLAGS=-N -l, but the
test/run.go test harness doesn't look at GO_GCFLAGS when processing
"errorcheck" files, it just calls compile:

  cmdline := []string{goTool(), "tool", "compile", /* etc */}

This is working as intended, since it makes the tests more robust and
independent from the environment; errorcheck files are supposed to set
additional building flags, when needed, like in:

  // errorcheck -0 -N -l

The test/bcecheck.go test used to work on the noopt builder (even if
bce is not active on -N -l) because the test was auto-contained and
the file always compiled with optimizations enabled.

In CL 107355, a new bce test dependent on an external package
(encoding.binary) was added. On the noopt builder the external package
is built using -N -l, and this causes a test failure that broke the
noopt builder:

  https://build.golang.org/log/b2be319536285e5807ee9d66d6d0ec4d57433768

To reproduce the failure, one can do:

  $ go install -a -gcflags="-N -l" std
  $ go run run.go -- checkbce.go

This change fixes the noopt builder breakage by removing the bce test
dependency on encoding/binary by defining a local Uint64() function to
be used in the test.

Change-Id: Ife71aab662001442e715c32a0b7d758349a63ff1
Reviewed-on: https://go-review.googlesource.com/136855
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/test/checkbce.go b/test/checkbce.go
index 0a2842f..770c4c2 100644
--- a/test/checkbce.go
+++ b/test/checkbce.go
@@ -10,8 +10,6 @@
 
 package main
 
-import "encoding/binary"
-
 func f0(a []int) {
 	a[0] = 1 // ERROR "Found IsInBounds$"
 	a[0] = 1
@@ -144,12 +142,18 @@
 	}
 }
 
+func Uint64(b []byte) uint64 {
+	_ = b[7] // ERROR "Found IsInBounds$"
+	return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
+		uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
+}
+
 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])
+		x += Uint64(data[:8])
+		x += Uint64(data[8:16])
+		x += Uint64(data[16:24])
+		x += Uint64(data[24:32])
 		data = data[32:]
 	}
 	return x
@@ -159,13 +163,13 @@
 	// 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)
+		x += Uint64(data)
 		data = data[8:]
-		x += binary.BigEndian.Uint64(data) // ERROR "Found IsInBounds$"
+		x += Uint64(data) // ERROR "Found IsInBounds$"
 		data = data[8:]
-		x += binary.BigEndian.Uint64(data) // ERROR "Found IsInBounds$"
+		x += Uint64(data) // ERROR "Found IsInBounds$"
 		data = data[8:]
-		x += binary.BigEndian.Uint64(data) // ERROR "Found IsInBounds$"
+		x += Uint64(data) // ERROR "Found IsInBounds$"
 		data = data[8:]
 	}
 	return x