mirror of
https://github.com/golang/go
synced 2024-11-26 03:57:57 -07:00
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:
parent
6652572b75
commit
7202341de9
@ -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
|
||||
|
16
test/fixedbugs/issue19671.go
Normal file
16
test/fixedbugs/issue19671.go
Normal 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
|
||||
}
|
20
test/fixedbugs/issue19696.go
Normal file
20
test/fixedbugs/issue19696.go
Normal 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++
|
||||
}
|
Loading…
Reference in New Issue
Block a user