summaryrefslogtreecommitdiff
path: root/gcc/testsuite/go.test/test/stack.go
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/go.test/test/stack.go
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/go.test/test/stack.go')
-rw-r--r--gcc/testsuite/go.test/test/stack.go72
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 000000000..816b555a4
--- /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)
+}