Commit 47e659b0 authored by Robert Griesemer's avatar Robert Griesemer

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 <gri@golang.org>
Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 3a5f7467
...@@ -2261,7 +2261,7 @@ func checksliceindex(l *Node, r *Node, tp *types.Type) bool { ...@@ -2261,7 +2261,7 @@ func checksliceindex(l *Node, r *Node, tp *types.Type) bool {
if r.Int64() < 0 { if r.Int64() < 0 {
yyerror("invalid slice index %v (index must be non-negative)", r) yyerror("invalid slice index %v (index must be non-negative)", r)
return false 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()) yyerror("invalid slice index %v (out of bounds for %d-element array)", r, tp.NumElem())
return false return false
} else if Isconst(l, CTSTR) && r.Int64() > int64(len(l.Val().U.(string))) { } else if Isconst(l, CTSTR) && r.Int64() > int64(len(l.Val().U.(string))) {
......
// 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"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment