// run | |
// Copyright 2012 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. | |
// Issue 4316: the stack overflow check in the linker | |
// is confused when it encounters a split-stack function | |
// that needs 0 bytes of stack space. | |
package main | |
type Peano *Peano | |
func makePeano(n int) *Peano { | |
if n == 0 { | |
return nil | |
} | |
p := Peano(makePeano(n - 1)) | |
return &p | |
} | |
var countArg Peano | |
var countResult int | |
func countPeano() { | |
if countArg == nil { | |
countResult = 0 | |
return | |
} | |
countArg = *countArg | |
countPeano() | |
countResult++ | |
} | |
var s = "(())" | |
var pT = 0 | |
func p() { | |
if pT >= len(s) { | |
return | |
} | |
if s[pT] == '(' { | |
pT += 1 | |
p() | |
if pT < len(s) && s[pT] == ')' { | |
pT += 1 | |
} else { | |
return | |
} | |
p() | |
} | |
} | |
func main() { | |
countArg = makePeano(4096) | |
countPeano() | |
if countResult != 4096 { | |
println("countResult =", countResult) | |
panic("countResult != 4096") | |
} | |
p() | |
} |