github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/issue4316.go (about)

     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  }