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
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 {
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")
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
--- /dev/null
+// 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
+)