cmd/compile: check SSAability in handling of INDEX of 1-element array

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>
This commit is contained in:
Cherry Zhang 2018-06-28 20:34:05 -04:00
parent 1d1e25fba8
commit d21bdf125c
2 changed files with 25 additions and 1 deletions

View 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 {

View file

@ -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]
}