diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c index e1a0758da1..353fc00ceb 100644 --- a/src/cmd/gc/sinit.c +++ b/src/cmd/gc/sinit.c @@ -953,7 +953,7 @@ void anylit(int ctxt, Node *n, Node *var, NodeList **init) { Type *t; - Node *a, *vstat; + Node *a, *vstat, *r; t = n->type; switch(n->op) { @@ -964,7 +964,14 @@ anylit(int ctxt, Node *n, Node *var, NodeList **init) if(!isptr[t->etype]) fatal("anylit: not ptr"); - a = nod(OAS, var, callnew(t->type)); + r = nod(ONEW, N, N); + r->typecheck = 1; + r->type = t; + r->esc = n->esc; + walkexpr(&r, init); + + a = nod(OAS, var, r); + typecheck(&a, Etop); *init = list(*init, a); diff --git a/test/fixedbugs/issue4618.go b/test/fixedbugs/issue4618.go new file mode 100644 index 0000000000..335feaadb0 --- /dev/null +++ b/test/fixedbugs/issue4618.go @@ -0,0 +1,40 @@ +// run + +// Copyright 2013 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. + +package main + +import ( + "fmt" + "os" + "testing" +) + +type T struct { int } + +var globl *T + +func F() { + t := &T{} + globl = t +} + +func G() { + t := &T{} + _ = t +} + +func main() { + nf := testing.AllocsPerRun(100, F) + ng := testing.AllocsPerRun(100, G) + if int(nf) != 1 { + fmt.Printf("AllocsPerRun(100, F) = %v, want 1\n", nf) + os.Exit(1) + } + if int(ng) != 0 { + fmt.Printf("AllocsPerRun(100, G) = %v, want 0\n", ng) + os.Exit(1) + } +}