]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: untyped arrays bounds representable as integers are valid
authorRobert Griesemer <gri@golang.org>
Wed, 5 Oct 2016 20:53:39 +0000 (13:53 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 5 Oct 2016 22:07:58 +0000 (22:07 +0000)
Fixes #13485.

Change-Id: I11dd15c7d14fc19d42a3b48427a4cc1208b18e6a
Reviewed-on: https://go-review.googlesource.com/30456
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/bug255.go
test/fixedbugs/issue13485.go [new file with mode: 0644]

index 3455319e77392bd94082c3f285f1c0818864a115..f2c6f5a3e98fdb690ff5cb5faac3580f86b09f99 100644 (file)
@@ -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")
index cc7d92fdb0f46dd42e3c011349a05417826ca2ac..247ca328c7af2b1046903c045b1697a2f7730864 100644 (file)
@@ -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
diff --git a/test/fixedbugs/issue13485.go b/test/fixedbugs/issue13485.go
new file mode 100644 (file)
index 0000000..a9beea1
--- /dev/null
@@ -0,0 +1,18 @@
+// 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
+)