From 47e659b01fa0e90906f2294e396ff2be03032966 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 22 Jun 2017 15:35:35 -0700 Subject: [PATCH] cmd/compile: fix array slice expression bounds check Fixes #20749. Change-Id: Ic6a7edc858575c4cb8b2e2ca97ee0c4b69f22c27 Reviewed-on: https://go-review.googlesource.com/46466 Run-TryBot: Robert Griesemer Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/typecheck.go | 2 +- test/fixedbugs/issue20749.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue20749.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index f21cc8f826..bff278b7ae 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -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 index 0000000000..af9ff3fbed --- /dev/null +++ b/test/fixedbugs/issue20749.go @@ -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" -- 2.50.0