summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Morsing <daniel.morsing@gmail.com>2014-10-20 15:59:10 +0100
committerDaniel Morsing <daniel.morsing@gmail.com>2014-10-20 15:59:10 +0100
commit316b5495d95710564da1bc50e8dadd68aac81095 (patch)
treee230443960695f8db4e70bcb563afc919f4cac2c
parent0e4a1bdbf20d797d770a5dfea8b7eafe4dcdc700 (diff)
downloadgo-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.c10
-rw-r--r--test/fixedbugs/issue8961.go20
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")
+ }
+}