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:
parent
a72f9f46a2
commit
2af3cbe308
@ -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);
|
||||
|
||||
|
40
test/fixedbugs/issue4618.go
Normal file
40
test/fixedbugs/issue4618.go
Normal 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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user