]> Cypherpunks repositories - gostls13.git/commitdiff
gc: bug268
authorRuss Cox <rsc@golang.org>
Thu, 29 Apr 2010 22:52:27 +0000 (15:52 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 29 Apr 2010 22:52:27 +0000 (15:52 -0700)
Fixes #745.

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

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

index d6df9ddb4f0ab89da75785bef93e6647d62c6ae3..ae1d13d17a57c5dd9fed6e426ca343b842d80250 100644 (file)
@@ -612,6 +612,12 @@ reswitch:
                defaultlit(&n->left, T);
                defaultlit(&n->right->left, types[TUINT]);
                defaultlit(&n->right->right, types[TUINT]);
+               if(isfixedarray(n->left->type)) {
+                       // Insert explicit & before fixed array
+                       // so that back end knows to move to heap.
+                       n->left = nod(OADDR, n->left, N);
+                       typecheck(&n->left, top);
+               }
                implicitstar(&n->left);
                if(n->right->left == N) {
                        yyerror("missing slice bounds?");
diff --git a/test/fixedbugs/bug268.go b/test/fixedbugs/bug268.go
new file mode 100644 (file)
index 0000000..a38d054
--- /dev/null
@@ -0,0 +1,53 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2010 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.
+
+// http://code.google.com/p/go/issues/detail?id=745
+
+package main
+
+type T1 struct {
+       T2 *T2
+}
+
+type T2 struct {
+       T3 *T3
+}
+
+type T3 struct {
+       T4 []*T4
+}
+
+type T4 struct {
+       X int
+}
+
+func f() *T1 {
+       x := &T1{
+               &T2{
+                       &T3{
+                               [1]*T4{
+                                       &T4{5},
+                               }[0:],
+                       },
+               },
+       }
+       return x
+}
+
+func g(x int) {
+       if x == 0 {
+               return
+       }
+       g(x-1)
+}
+
+func main() {
+       x := f()
+       g(100) // smash temporaries left over on stack
+       if x.T2.T3.T4[0].X != 5 {
+               println("BUG", x.T2.T3.T4[0].X)
+       }
+}