1// run
2
3// Copyright 2016 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// Make sure we don't start marshaling (writing to the stack)
8// arguments until those arguments are evaluated and known
9// not to unconditionally panic. If they unconditionally panic,
10// we write some args but never do the call. That messes up
11// the logic which decides how big the argout section needs to be.
12
13package main
14
15type W interface {
16	Write([]byte)
17}
18
19type F func(W)
20
21func foo(f F) {
22	defer func() {
23		if r := recover(); r != nil {
24			usestack(1000)
25		}
26	}()
27	f(nil)
28}
29
30func main() {
31	foo(func(w W) {
32		var x []string
33		w.Write([]byte(x[5]))
34	})
35}
36
37func usestack(n int) {
38	if n == 0 {
39		return
40	}
41	usestack(n - 1)
42}
43