From 10eb76b04e4700089a0df73cdbfba350fc1cef1a Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 29 Apr 2010 15:52:27 -0700 Subject: [PATCH] gc: bug268 Fixes #745. R=ken2 CC=golang-dev https://golang.org/cl/1008045 --- src/cmd/gc/typecheck.c | 6 +++++ test/fixedbugs/bug268.go | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 test/fixedbugs/bug268.go diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index d6df9ddb4f..ae1d13d17a 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 0000000000..a38d0545b1 --- /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) + } +} -- 2.50.0