blob: 816b555a4c8849618a26ad9498fead3878c52d6b [file] [log] [blame]
Russ Cox6ee6d6e2009-01-28 16:58:48 -08001// $G $D/$F.go && $L $F.$A && ./$A.out
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Try to tickle stack splitting bugs by doing
Russ Cox0f4f2a62009-02-06 13:46:56 -08008// go, defer, and closure calls at different stack depths.
Russ Cox6ee6d6e2009-01-28 16:58:48 -08009
10package main
11
Rob Pike325cf8e2010-03-24 16:46:53 -070012type T [20]int
Russ Cox6ee6d6e2009-01-28 16:58:48 -080013
14func g(c chan int, t T) {
Rob Pike325cf8e2010-03-24 16:46:53 -070015 s := 0
Russ Cox6ee6d6e2009-01-28 16:58:48 -080016 for i := 0; i < len(t); i++ {
Rob Pike325cf8e2010-03-24 16:46:53 -070017 s += t[i]
Russ Cox6ee6d6e2009-01-28 16:58:48 -080018 }
Rob Pike325cf8e2010-03-24 16:46:53 -070019 c <- s
Russ Cox6ee6d6e2009-01-28 16:58:48 -080020}
21
22func d(t T) {
Rob Pike325cf8e2010-03-24 16:46:53 -070023 s := 0
Russ Cox6ee6d6e2009-01-28 16:58:48 -080024 for i := 0; i < len(t); i++ {
Rob Pike325cf8e2010-03-24 16:46:53 -070025 s += t[i]
Russ Cox6ee6d6e2009-01-28 16:58:48 -080026 }
27 if s != len(t) {
Rob Pike325cf8e2010-03-24 16:46:53 -070028 println("bad defer", s)
29 panic("fail")
Russ Cox6ee6d6e2009-01-28 16:58:48 -080030 }
31}
32
Rob Pike325cf8e2010-03-24 16:46:53 -070033var c = make(chan int)
34var t T
35var b = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Russ Cox6ee6d6e2009-01-28 16:58:48 -080036
37func recur(n int) {
Rob Pike325cf8e2010-03-24 16:46:53 -070038 ss := string(b)
Russ Cox78edbfd2009-04-10 06:22:41 -070039 if len(ss) != len(b) {
Rob Pike325cf8e2010-03-24 16:46:53 -070040 panic("bad []byte -> string")
Russ Cox78edbfd2009-04-10 06:22:41 -070041 }
Rob Pike325cf8e2010-03-24 16:46:53 -070042 go g(c, t)
43 s := <-c
Russ Cox6ee6d6e2009-01-28 16:58:48 -080044 if s != len(t) {
Rob Pike325cf8e2010-03-24 16:46:53 -070045 println("bad go", s)
46 panic("fail")
Russ Cox6ee6d6e2009-01-28 16:58:48 -080047 }
Russ Cox0f4f2a62009-02-06 13:46:56 -080048 f := func(t T) int {
Rob Pike325cf8e2010-03-24 16:46:53 -070049 s := 0
Russ Cox0f4f2a62009-02-06 13:46:56 -080050 for i := 0; i < len(t); i++ {
Rob Pike325cf8e2010-03-24 16:46:53 -070051 s += t[i]
Russ Cox0f4f2a62009-02-06 13:46:56 -080052 }
Rob Pike325cf8e2010-03-24 16:46:53 -070053 s += n
54 return s
55 }
56 s = f(t)
57 if s != len(t)+n {
58 println("bad func", s, "at level", n)
59 panic("fail")
Russ Cox0f4f2a62009-02-06 13:46:56 -080060 }
Russ Cox6ee6d6e2009-01-28 16:58:48 -080061 if n > 0 {
Rob Pike325cf8e2010-03-24 16:46:53 -070062 recur(n - 1)
Russ Cox6ee6d6e2009-01-28 16:58:48 -080063 }
Rob Pike325cf8e2010-03-24 16:46:53 -070064 defer d(t)
Russ Cox6ee6d6e2009-01-28 16:58:48 -080065}
66
67func main() {
68 for i := 0; i < len(t); i++ {
Rob Pike325cf8e2010-03-24 16:46:53 -070069 t[i] = 1
Russ Cox6ee6d6e2009-01-28 16:58:48 -080070 }
Russ Coxc6138ef2010-04-22 17:52:22 -070071 recur(8000)
Russ Cox6ee6d6e2009-01-28 16:58:48 -080072}