From: Daniel Morsing Date: Mon, 20 Oct 2014 14:59:10 +0000 (+0100) Subject: cmd/gc: emit code for extern = X-Git-Tag: go1.4beta1~79 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0edafefc36b39dd456d3b6410f81dfcecfef6a3b;p=gostls13.git cmd/gc: emit code for extern = https://golang.org/cl/152700045/ made it possible for struct literals assigned to globals to use 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 can occur from non-initialization code, we need to emit this code. We don't use 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 --- diff --git a/src/cmd/gc/gen.c b/src/cmd/gc/gen.c index a7db833a1a..c7c9fcdaff 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 0000000000..fbfb7e67f9 --- /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") + } +}