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 11 package main 12 13 type Peano *Peano 14 15 func makePeano(n int) *Peano { 16 if n == 0 { 17 return nil 18 } 19 p := Peano(makePeano(n - 1)) 20 return &p 21 } 22 23 var countArg Peano 24 var countResult int 25 26 func countPeano() { 27 if countArg == nil { 28 countResult = 0 29 return 30 } 31 countArg = *countArg 32 countPeano() 33 countResult++ 34 } 35 36 var s = "(())" 37 var pT = 0 38 39 func 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 55 func 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