]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: skip array bounds errors when type is broken
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 10 Apr 2017 20:43:36 +0000 (13:43 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 10 Apr 2017 20:57:08 +0000 (20:57 +0000)
This avoids false positives
like those found in #19880.

Fixes #19880

Change-Id: I583c16cc3c71e7462a72500db9ea2547c468f8c1
Reviewed-on: https://go-review.googlesource.com/40255
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/bug255.go
test/fixedbugs/issue19880.go [new file with mode: 0644]
test/fixedbugs/issue7525.go
test/fixedbugs/issue7525b.go [new file with mode: 0644]
test/fixedbugs/issue7525c.go [new file with mode: 0644]

index db4ea0a8954d7bff86f04fa02dc0dc366d39c1a7..2e7664ccd238a21af98b59110066260c6e75e89c 100644 (file)
@@ -369,9 +369,12 @@ OpSwitch:
                        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
index 247ca328c7af2b1046903c045b1697a2f7730864..458fb972b20958484e89e011c97a7c179097c14c 100644 (file)
@@ -11,7 +11,7 @@ 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 "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
 
diff --git a/test/fixedbugs/issue19880.go b/test/fixedbugs/issue19880.go
new file mode 100644 (file)
index 0000000..629c95d
--- /dev/null
@@ -0,0 +1,20 @@
+// 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
+}
index 4e1d88aab0badc732fdcbac005130123ef26985a..6e6959312e500938e6ea65ac31e42c67156893bb 100644 (file)
@@ -11,9 +11,7 @@ package main
 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"
 }
diff --git a/test/fixedbugs/issue7525b.go b/test/fixedbugs/issue7525b.go
new file mode 100644 (file)
index 0000000..20a62ee
--- /dev/null
@@ -0,0 +1,13 @@
+// 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"
+}
diff --git a/test/fixedbugs/issue7525c.go b/test/fixedbugs/issue7525c.go
new file mode 100644 (file)
index 0000000..f633b1c
--- /dev/null
@@ -0,0 +1,13 @@
+// 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"
+}