Commit 0edafefc authored by Daniel Morsing's avatar Daniel Morsing

cmd/gc: emit code for extern = <N>

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
parent 63acc48f
......@@ -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)
// heaps should already be clear
if(nr == N && (nl->class & PHEAP))
return;
if(nl->class & PHEAP)
return;
}
tl = nl->type;
if(tl == T)
......
// 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")
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment