// run | |
// Copyright 2016 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. | |
// Make sure we don't start marshaling (writing to the stack) | |
// arguments until those arguments are evaluated and known | |
// not to unconditinally panic. If they unconditionally panic, | |
// we write some args but never do the call. That messes up | |
// the logic which decides how big the argout section needs to be. | |
package main | |
type W interface { | |
Write([]byte) | |
} | |
type F func(W) | |
func foo(f F) { | |
defer func() { | |
if r := recover(); r != nil { | |
usestack(1000) | |
} | |
}() | |
f(nil) | |
} | |
func main() { | |
foo(func(w W) { | |
var x []string | |
w.Write([]byte(x[5])) | |
}) | |
} | |
func usestack(n int) { | |
if n == 0 { | |
return | |
} | |
usestack(n - 1) | |
} |