]> Cypherpunks repositories - gostls13.git/commitdiff
gc: zero stack-allocated slice backing arrays
authorRuss Cox <rsc@golang.org>
Fri, 2 Sep 2011 19:11:28 +0000 (15:11 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 2 Sep 2011 19:11:28 +0000 (15:11 -0400)
Fixes Han-Wen's termite bug.

R=lvd
CC=golang-dev
https://golang.org/cl/4977052

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

index ed2b7091562e1eb77de47767ba754ab4c14d1dc4..d98f4fef29af411d368a3f605761fe2a03b34410 100644 (file)
@@ -696,6 +696,7 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
        if(n->esc == EscNone) {
                a = nod(OXXX, N, N);
                tempname(a, t);
+               *init = list(*init, nod(OAS, a, N));  // zero new temp
                a = nod(OADDR, a, N);
        } else {
                a = nod(ONEW, N, N);
diff --git a/test/escape3.go b/test/escape3.go
new file mode 100644 (file)
index 0000000..fc2d6eb
--- /dev/null
@@ -0,0 +1,36 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2011 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.
+
+// Test run-time behavior of escape analysis-related optimizations.
+
+package main
+
+func main() {
+       test1()
+}
+
+func test1() {
+       check1(0)
+       check1(1)
+       check1(2)
+}
+
+type T1 struct {
+       X, Y, Z int
+}
+
+func f() int {
+       return 1
+}
+
+func check1(pass int) T1 {
+       v := []T1{{X: f(), Z: f()}}
+       if v[0].Y != 0 {
+               panic("nonzero init")
+       }
+       v[0].Y = pass
+       return v[0]
+}