n.Left = indexlit(typecheck(n.Left, Erv))
l := n.Left
if consttype(l) != CTINT {
- if l.Type != nil && l.Type.IsInteger() && l.Op != OLITERAL {
+ switch {
+ case l.Type == nil:
+ // Error already reported elsewhere.
+ case l.Type.IsInteger() && l.Op != OLITERAL:
yyerror("non-constant array bound %v", l)
- } else {
+ default:
yyerror("invalid array bound %v", l)
}
n.Type = nil
var c [1.5]int // ERROR "truncated"
var d ["abc"]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 f [e]int // ok: error already reported for e
var g [1 << 65]int // ERROR "array bound is too large|overflows"
var h [len(a)]int // ok
--- /dev/null
+// 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
+
+type T struct {
+ f [1]int
+}
+
+func a() {
+ _ = T // ERROR "type T is not an expression"
+}
+
+func b() {
+ var v [len(T{}.f)]int // ok
+ _ = v
+}
import "unsafe"
var x struct {
- a [unsafe.Sizeof(x.a)]int // ERROR "array bound|typechecking loop|invalid expression"
+ a [unsafe.Sizeof(x.a)]int // ERROR "array bound|typechecking loop|invalid expression"
b [unsafe.Offsetof(x.b)]int // ERROR "array bound"
- c [unsafe.Alignof(x.c)]int // ERROR "array bound|invalid expression"
- d [len(x.d)]int // ERROR "array bound|invalid array"
- e [cap(x.e)]int // ERROR "array bound|invalid array"
+ c [unsafe.Alignof(x.c)]int // ERROR "array bound|invalid expression"
}
--- /dev/null
+// 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.
+
+// Issue 7525: self-referential array types.
+
+package main
+
+var y struct {
+ d [len(y.d)]int // ERROR "array bound|typechecking loop|invalid array"
+}
--- /dev/null
+// 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.
+
+// Issue 7525: self-referential array types.
+
+package main
+
+var z struct {
+ e [cap(z.e)]int // ERROR "array bound|typechecking loop|invalid array"
+}