]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: emit code for extern = <N>
authorDaniel Morsing <daniel.morsing@gmail.com>
Mon, 20 Oct 2014 14:59:10 +0000 (15:59 +0100)
committerDaniel Morsing <daniel.morsing@gmail.com>
Mon, 20 Oct 2014 14:59:10 +0000 (15:59 +0100)
https://golang.org/cl/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 #8961.

LGTM=rsc
R=golang-codereviews, rsc
CC=bradfitz, golang-codereviews
https://golang.org/cl/154540044

src/cmd/gc/gen.c
test/fixedbugs/issue8961.go [new file with mode: 0644]

index a7db833a1a32a8a2bac91031ea41636e88190f8f..c7c9fcdaff8763fc347cd7219f6b9024859c0444 100644 (file)
@@ -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 (file)
index 0000000..fbfb7e6
--- /dev/null
@@ -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")
+       }
+}