]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: only SSA [0]T when T is SSA-able
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 16:36:31 +0000 (09:36 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 16:53:22 +0000 (16:53 +0000)
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>

src/cmd/compile/internal/gc/ssa.go
test/fixedbugs/issue19671.go [new file with mode: 0644]
test/fixedbugs/issue19696.go [new file with mode: 0644]

index 708269171df134ec07c3a323c38133135a161542..e223607c6684955d98d67307400f12ffd1f1621f 100644 (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
diff --git a/test/fixedbugs/issue19671.go b/test/fixedbugs/issue19671.go
new file mode 100644 (file)
index 0000000..475c3e0
--- /dev/null
@@ -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 (file)
index 0000000..4cb2789
--- /dev/null
@@ -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++
+}