aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2017-02-08 15:31:24 -0500
committerCherry Zhang <cherryyz@google.com>2017-02-08 21:01:51 +0000
commita146dd3a2fdf87bab90ee1f636c38cd3444e55fa (patch)
tree771c4b8a0abbb22f958e168da103f15e40643807 /src
parente3efdffacdd27786ecf0647272e54c664daf4c94 (diff)
downloadgo-a146dd3a2fdf87bab90ee1f636c38cd3444e55fa.tar.xz
cmd/compile: handle DOT STRUCTLIT for zero-valued struct in SSA
CL 35261 makes SSA handle zero-valued STRUCTLIT, but DOT operation was not handled. Fixes #18994. Change-Id: Ic7976036acca1523b0b14afac4d170797e8aee20 Reviewed-on: https://go-review.googlesource.com/36565 Run-TryBot: Cherry Zhang <cherryyz@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/ssa.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 7d362fb311..1f0f1b0d91 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -1956,6 +1956,15 @@ func (s *state) expr(n *Node) *ssa.Value {
v := s.expr(n.Left)
return s.newValue1I(ssa.OpStructSelect, n.Type, int64(fieldIdx(n)), v)
}
+ if n.Left.Op == OSTRUCTLIT {
+ // All literals with nonzero fields have already been
+ // rewritten during walk. Any that remain are just T{}
+ // or equivalents. Use the zero value.
+ if !iszero(n.Left) {
+ Fatalf("literal with nonzero value in SSA: %v", n.Left)
+ }
+ return s.zeroVal(n.Type)
+ }
p, _ := s.addr(n, false)
return s.newValue2(ssa.OpLoad, n.Type, p, s.mem())