blob: de9a61b497d9eea7c771c4fa55b81eee7696e4e7 [file] [log] [blame]
Rémy Oudompheng2e734532012-11-26 21:51:48 +01001// run
2
Emmanuel Odeke53fd5222016-04-10 14:32:26 -07003// Copyright 2012 The Go Authors. All rights reserved.
Rémy Oudompheng2e734532012-11-26 21:51:48 +01004// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Issue 4316: the stack overflow check in the linker
8// is confused when it encounters a split-stack function
9// that needs 0 bytes of stack space.
10
11package main
12
13type Peano *Peano
14
15func makePeano(n int) *Peano {
16 if n == 0 {
17 return nil
18 }
19 p := Peano(makePeano(n - 1))
20 return &p
21}
22
23var countArg Peano
24var countResult int
25
26func countPeano() {
27 if countArg == nil {
28 countResult = 0
29 return
30 }
31 countArg = *countArg
32 countPeano()
33 countResult++
34}
35
36var s = "(())"
37var pT = 0
38
39func p() {
40 if pT >= len(s) {
41 return
42 }
43 if s[pT] == '(' {
44 pT += 1
45 p()
46 if pT < len(s) && s[pT] == ')' {
47 pT += 1
48 } else {
49 return
50 }
51 p()
52 }
53}
54
55func main() {
56 countArg = makePeano(4096)
57 countPeano()
58 if countResult != 4096 {
59 println("countResult =", countResult)
60 panic("countResult != 4096")
61 }
62
63 p()
64}