mirror of
https://github.com/golang/go
synced 2024-11-23 02:00:03 -07:00
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:
parent
1d1e25fba8
commit
d21bdf125c
@ -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 {
|
||||
|
23
test/fixedbugs/issue26120.go
Normal file
23
test/fixedbugs/issue26120.go
Normal 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]
|
||||
}
|
Loading…
Reference in New Issue
Block a user