diff options
author | Russ Cox <rsc@golang.org> | 2010-04-29 15:52:27 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-04-29 15:52:27 -0700 |
commit | 77722362c5a7ac05c5e5010a75630cbb9aae2585 (patch) | |
tree | f625a35087e357754b4f08a7442cfbaf8f1a413c | |
parent | 154643d15cd912706dd21e49a3fe1be5a9361e06 (diff) | |
download | golang-77722362c5a7ac05c5e5010a75630cbb9aae2585.tar.gz |
gc: bug268
Fixes issue 745.
R=ken2
CC=golang-dev
http://codereview.appspot.com/1008045
-rw-r--r-- | src/cmd/gc/typecheck.c | 6 | ||||
-rw-r--r-- | test/fixedbugs/bug268.go | 53 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index d6df9ddb4..ae1d13d17 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -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 index 000000000..a38d0545b --- /dev/null +++ b/test/fixedbugs/bug268.go @@ -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) + } +} |