Commit 2af3cbe3 authored by Russ Cox's avatar Russ Cox

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

Fixes #4618.

R=ken2
CC=golang-dev
https://golang.org/cl/7278048
parent a72f9f46
......@@ -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);
......
// 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)
}
}
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