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