cmd/compile: only SSA [0]T when T is SSA-able

Almost never happens in practice.
The compiler will generate reasonable code anyway,
since assignments involving [0]T never do any work.

Fixes #19696
Fixes #19671

Change-Id: I350d2e0c5bb326c4789c74a046ab0486b2cee49c
Reviewed-on: https://go-review.googlesource.com/38599
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2017-03-24 09:36:31 -07:00
parent 6652572b75
commit 7202341de9
3 changed files with 37 additions and 4 deletions

View file

@ -3294,10 +3294,7 @@ func canSSAType(t *Type) bool {
// We can't do larger arrays because dynamic indexing is
// not supported on SSA variables.
// TODO: allow if all indexes are constant.
if t.NumElem() == 0 {
return true
}
if t.NumElem() == 1 {
if t.NumElem() <= 1 {
return canSSAType(t.Elem())
}
return false

View file

@ -0,0 +1,16 @@
// compile
// Copyright 2017 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.
// Used to crash when compiling assignments involving [0]T,
// where T is not SSA-able.
package a
func f() {
var i int
arr := [0][2]int{}
arr[i][0] = 0
}

View file

@ -0,0 +1,20 @@
// compile
// Copyright 2017 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.
// Used to crash when compiling assignments involving [0]T,
// where T is not SSA-able.
package p
type s struct {
a, b, c, d, e int
}
func f() {
var i int
arr := [0]s{}
arr[i].a++
}