From 7202341de92927484a3eed101d3b77653b8b8bd1 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 24 Mar 2017 09:36:31 -0700 Subject: [PATCH] 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 Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/ssa.go | 5 +---- test/fixedbugs/issue19671.go | 16 ++++++++++++++++ test/fixedbugs/issue19696.go | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 test/fixedbugs/issue19671.go create mode 100644 test/fixedbugs/issue19696.go diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 708269171df..e223607c668 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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 diff --git a/test/fixedbugs/issue19671.go b/test/fixedbugs/issue19671.go new file mode 100644 index 00000000000..475c3e0afc6 --- /dev/null +++ b/test/fixedbugs/issue19671.go @@ -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 +} diff --git a/test/fixedbugs/issue19696.go b/test/fixedbugs/issue19696.go new file mode 100644 index 00000000000..4cb2789091c --- /dev/null +++ b/test/fixedbugs/issue19696.go @@ -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++ +}