Home | History | Annotate | Download | only in fixedbugs
      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