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