mirror of https://github.com/golang/go.git
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
This commit is contained in:
parent
63acc48f87
commit
0edafefc36
|
|
@ -732,13 +732,9 @@ cgen_as(Node *nl, Node *nr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nr == N || iszero(nr)) {
|
if(nr == N || iszero(nr)) {
|
||||||
// externals and heaps should already be clear
|
// heaps should already be clear
|
||||||
if(nr == N) {
|
if(nr == N && (nl->class & PHEAP))
|
||||||
if(nl->class == PEXTERN)
|
return;
|
||||||
return;
|
|
||||||
if(nl->class & PHEAP)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tl = nl->type;
|
tl = nl->type;
|
||||||
if(tl == T)
|
if(tl == T)
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue