1
0
mirror of https://github.com/golang/go synced 2024-11-11 23:40:22 -07:00

cmd/gc: treat &T{} like new(T): allocate on stack if possible

Fixes #4618.

R=ken2
CC=golang-dev
https://golang.org/cl/7278048
This commit is contained in:
Russ Cox 2013-02-02 23:54:21 -05:00
parent a72f9f46a2
commit 2af3cbe308
2 changed files with 49 additions and 2 deletions

View File

@ -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);

View File

@ -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)
}
}