diff options
Diffstat (limited to 'gcc/testsuite/go.test/test/stack.go')
-rw-r--r-- | gcc/testsuite/go.test/test/stack.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/gcc/testsuite/go.test/test/stack.go b/gcc/testsuite/go.test/test/stack.go new file mode 100644 index 00000000000..816b555a4c8 --- /dev/null +++ b/gcc/testsuite/go.test/test/stack.go @@ -0,0 +1,72 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out + +// Copyright 2009 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. + +// Try to tickle stack splitting bugs by doing +// go, defer, and closure calls at different stack depths. + +package main + +type T [20]int + +func g(c chan int, t T) { + s := 0 + for i := 0; i < len(t); i++ { + s += t[i] + } + c <- s +} + +func d(t T) { + s := 0 + for i := 0; i < len(t); i++ { + s += t[i] + } + if s != len(t) { + println("bad defer", s) + panic("fail") + } +} + +var c = make(chan int) +var t T +var b = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + +func recur(n int) { + ss := string(b) + if len(ss) != len(b) { + panic("bad []byte -> string") + } + go g(c, t) + s := <-c + if s != len(t) { + println("bad go", s) + panic("fail") + } + f := func(t T) int { + s := 0 + for i := 0; i < len(t); i++ { + s += t[i] + } + s += n + return s + } + s = f(t) + if s != len(t)+n { + println("bad func", s, "at level", n) + panic("fail") + } + if n > 0 { + recur(n - 1) + } + defer d(t) +} + +func main() { + for i := 0; i < len(t); i++ { + t[i] = 1 + } + recur(8000) +} |