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