// 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() }