From d21bdf125c76cc4f5b5efad59f39c435ca8aaa14 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 28 Jun 2018 20:34:05 -0400 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/ssa.go | 3 ++- test/fixedbugs/issue26120.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue26120.go diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 92bfa7de4fb..ff2b93d3d4d 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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 index 00000000000..94bf7d9cb78 --- /dev/null +++ b/test/fixedbugs/issue26120.go @@ -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] +}