mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
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>
This commit is contained in:
parent
e3efdffacd
commit
a146dd3a2f
|
@ -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())
|
||||
|
||||
|
|
22
test/fixedbugs/issue18994.go
Normal file
22
test/fixedbugs/issue18994.go
Normal file
|
@ -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")
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue