Commit 936ae27b authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile: untyped arrays bounds representable as integers are valid

Fixes #13485.

Change-Id: I11dd15c7d14fc19d42a3b48427a4cc1208b18e6a
Reviewed-on: https://go-review.googlesource.com/30456Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
parent f6b4c889
......@@ -340,18 +340,16 @@ OpSwitch:
case OTARRAY:
ok |= Etype
var t *Type
l := n.Left
r := n.Right
r = typecheck(r, Etype)
r := typecheck(n.Right, Etype)
if r.Type == nil {
n.Type = nil
return n
}
if l == nil {
var t *Type
if n.Left == nil {
t = typSlice(r.Type)
} else if l.Op == ODDD {
} else if n.Left.Op == ODDD {
t = typDDDArray(r.Type)
if top&Ecomplit == 0 && n.Diag == 0 {
t.Broke = true
......@@ -359,17 +357,9 @@ OpSwitch:
yyerror("use of [...] array outside of array literal")
}
} else {
n.Left = typecheck(n.Left, Erv)
n.Left = indexlit(typecheck(n.Left, Erv))
l := n.Left
var v Val
switch consttype(l) {
case CTINT, CTRUNE:
v = l.Val()
case CTFLT:
v = toint(l.Val())
default:
if consttype(l) != CTINT {
if l.Type != nil && l.Type.IsInteger() && l.Op != OLITERAL {
yyerror("non-constant array bound %v", l)
} else {
......@@ -379,11 +369,13 @@ OpSwitch:
return n
}
v := l.Val()
if doesoverflow(v, Types[TINT]) {
yyerror("array bound is too large")
n.Type = nil
return n
}
bound := v.U.(*Mpint).Int64()
if bound < 0 {
yyerror("array bound must be non-negative")
......
......@@ -10,7 +10,7 @@ var a [10]int // ok
var b [1e1]int // ok
var c [1.5]int // ERROR "truncated"
var d ["abc"]int // ERROR "invalid array bound|not numeric"
var e [nil]int // ERROR "invalid array bound|not numeric"
var e [nil]int // ERROR "use of untyped nil|invalid array bound|not numeric"
var f [e]int // ERROR "invalid array bound|not constant"
var g [1 << 65]int // ERROR "array bound is too large|overflows"
var h [len(a)]int // ok
......
// errorcheck
// Copyright 2010 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
var (
_ [10]int
_ [10.0]int
_ [float64(10)]int // ERROR "invalid array bound"
_ [10 + 0i]int
_ [complex(10, 0)]int
_ [complex128(complex(10, 0))]int // ERROR "invalid array bound"
_ ['a']int
_ [rune(65)]int
)
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