]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix array slice expression bounds check
authorRobert Griesemer <gri@golang.org>
Thu, 22 Jun 2017 22:35:35 +0000 (15:35 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 22 Jun 2017 23:31:45 +0000 (23:31 +0000)
Fixes #20749.

Change-Id: Ic6a7edc858575c4cb8b2e2ca97ee0c4b69f22c27
Reviewed-on: https://go-review.googlesource.com/46466
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue20749.go [new file with mode: 0644]

index f21cc8f826b6035d38bdf1b81fce6d41f08d20c4..bff278b7aedeff5af51def52e2573776b25740a6 100644 (file)
@@ -2261,7 +2261,7 @@ func checksliceindex(l *Node, r *Node, tp *types.Type) bool {
                if r.Int64() < 0 {
                        yyerror("invalid slice index %v (index must be non-negative)", r)
                        return false
-               } else if tp != nil && tp.NumElem() > 0 && r.Int64() > tp.NumElem() {
+               } else if tp != nil && tp.NumElem() >= 0 && r.Int64() > tp.NumElem() {
                        yyerror("invalid slice index %v (out of bounds for %d-element array)", r, tp.NumElem())
                        return false
                } else if Isconst(l, CTSTR) && r.Int64() > int64(len(l.Val().U.(string))) {
diff --git a/test/fixedbugs/issue20749.go b/test/fixedbugs/issue20749.go
new file mode 100644 (file)
index 0000000..af9ff3f
--- /dev/null
@@ -0,0 +1,15 @@
+// errorcheck
+
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+// Verify that the compiler complains even if the array
+// has length 0.
+var a [0]int
+var _ = a[2:] // ERROR "invalid slice index 2"
+
+var b [1]int
+var _ = b[2:] // ERROR "invalid slice index 2"