]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: treat &T{} like new(T): allocate on stack if possible
authorRuss Cox <rsc@golang.org>
Sun, 3 Feb 2013 04:54:21 +0000 (23:54 -0500)
committerRuss Cox <rsc@golang.org>
Sun, 3 Feb 2013 04:54:21 +0000 (23:54 -0500)
Fixes #4618.

R=ken2
CC=golang-dev
https://golang.org/cl/7278048

src/cmd/gc/sinit.c
test/fixedbugs/issue4618.go [new file with mode: 0644]

index e1a0758da17496f0f2836e45e187c702872fec35..353fc00ceba200fe840103e12874cd5a25f5d573 100644 (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);
 
diff --git a/test/fixedbugs/issue4618.go b/test/fixedbugs/issue4618.go
new file mode 100644 (file)
index 0000000..335feaa
--- /dev/null
@@ -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)
+       }
+}