1// run
2
3// Copyright 2012 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// 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}
65