From: Cherry Zhang Date: Wed, 8 Feb 2017 20:31:24 +0000 (-0500) Subject: cmd/compile: handle DOT STRUCTLIT for zero-valued struct in SSA X-Git-Tag: go1.9beta1~1668 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a146dd3a2fdf87bab90ee1f636c38cd3444e55fa;p=gostls13.git 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 Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- 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()) diff --git a/test/fixedbugs/issue18994.go b/test/fixedbugs/issue18994.go new file mode 100644 index 0000000000..aa307139f5 --- /dev/null +++ b/test/fixedbugs/issue18994.go @@ -0,0 +1,22 @@ +// run + +// 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. + +// Issue 18994: SSA didn't handle DOT STRUCTLIT for zero-valued +// STRUCTLIT. + +package main + +// large struct - not SSA-able +type T struct { + a, b, c, d, e, f, g, h int +} + +func main() { + x := T{}.a + if x != 0 { + panic("FAIL") + } +}