]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: check SSAability in handling of INDEX of 1-element array
authorCherry Zhang <cherryyz@google.com>
Fri, 29 Jun 2018 00:34:05 +0000 (20:34 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 29 Jun 2018 12:05:05 +0000 (12:05 +0000)
SSA can handle 1-element array, but only when the element type
is SSAable. When building SSA for INDEX of 1-element array, we
did not check the element type is SSAable. And when it's not,
it resulted in an unhandled SSA op.

Fixes #26120.

Change-Id: Id709996b5d9d90212f6c56d3f27eed320a4d8360
Reviewed-on: https://go-review.googlesource.com/121496
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/ssa.go
test/fixedbugs/issue26120.go [new file with mode: 0644]

index 92bfa7de4fb375300f73d3504e866f6d548d9fda..ff2b93d3d4d98d0c571559a609ccbc783a713cfb 100644 (file)
@@ -2170,8 +2170,9 @@ func (s *state) expr(n *Node) *ssa.Value {
                        p := s.addr(n, false)
                        return s.load(n.Left.Type.Elem(), p)
                case n.Left.Type.IsArray():
-                       if bound := n.Left.Type.NumElem(); bound <= 1 {
+                       if canSSAType(n.Left.Type) {
                                // SSA can handle arrays of length at most 1.
+                               bound := n.Left.Type.NumElem()
                                a := s.expr(n.Left)
                                i := s.expr(n.Right)
                                if bound == 0 {
diff --git a/test/fixedbugs/issue26120.go b/test/fixedbugs/issue26120.go
new file mode 100644 (file)
index 0000000..94bf7d9
--- /dev/null
@@ -0,0 +1,23 @@
+// compile
+
+// Copyright 2018 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 26120: INDEX of 1-element but non-SSAable array
+// is mishandled when building SSA.
+
+package p
+
+type T [1]struct {
+       f    []int
+       i, j int
+}
+
+func F() {
+       var v T
+       f := func() T {
+               return v
+       }
+       _ = []int{}[f()[0].i]
+}