diff options
author | Daniel Morsing <daniel.morsing@gmail.com> | 2014-10-20 15:59:10 +0100 |
---|---|---|
committer | Daniel Morsing <daniel.morsing@gmail.com> | 2014-10-20 15:59:10 +0100 |
commit | 316b5495d95710564da1bc50e8dadd68aac81095 (patch) | |
tree | e230443960695f8db4e70bcb563afc919f4cac2c | |
parent | 0e4a1bdbf20d797d770a5dfea8b7eafe4dcdc700 (diff) | |
download | go-316b5495d95710564da1bc50e8dadd68aac81095.tar.gz |
cmd/gc: emit code for extern = <N>
https://codereview.appspot.com/152700045/ made it possible for struct literals assigned to globals to use <N> as the RHS. Normally, this is to zero out variables on first use. Because globals are already zero (or their linker initialized value), we just ignored this.
Now that <N> can occur from non-initialization code, we need to emit this code. We don't use <N> for initialization of globals any more, so this shouldn't cause any excessive zeroing.
Fixes issue 8961.
LGTM=rsc
R=golang-codereviews, rsc
CC=bradfitz, golang-codereviews
https://codereview.appspot.com/154540044
-rw-r--r-- | src/cmd/gc/gen.c | 10 | ||||
-rw-r--r-- | test/fixedbugs/issue8961.go | 20 |
2 files changed, 23 insertions, 7 deletions
diff --git a/src/cmd/gc/gen.c b/src/cmd/gc/gen.c index a7db833a1..c7c9fcdaf 100644 --- a/src/cmd/gc/gen.c +++ b/src/cmd/gc/gen.c @@ -732,13 +732,9 @@ cgen_as(Node *nl, Node *nr) } if(nr == N || iszero(nr)) { - // externals and heaps should already be clear - if(nr == N) { - if(nl->class == PEXTERN) - return; - if(nl->class & PHEAP) - return; - } + // heaps should already be clear + if(nr == N && (nl->class & PHEAP)) + return; tl = nl->type; if(tl == T) diff --git a/test/fixedbugs/issue8961.go b/test/fixedbugs/issue8961.go new file mode 100644 index 000000000..fbfb7e67f --- /dev/null +++ b/test/fixedbugs/issue8961.go @@ -0,0 +1,20 @@ +// run + +// Copyright 2014 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 8961. Empty composite literals to small globals were not filled in +package main + +type small struct { a int } +var foo small + +func main() { + foo.a = 1 + foo = small{} + if foo.a != 0 { + println("expected foo.a to be 0, was", foo.a) + panic("composite literal not filled in") + } +} |