From 2af3cbe308986005715bed3fa8ec5975e32ea7b7 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 2 Feb 2013 23:54:21 -0500 Subject: [PATCH] cmd/gc: treat &T{} like new(T): allocate on stack if possible Fixes #4618. R=ken2 CC=golang-dev https://golang.org/cl/7278048 --- src/cmd/gc/sinit.c | 11 ++++++++-- test/fixedbugs/issue4618.go | 40 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue4618.go 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) + } +} -- 2.48.1