1// run
2
3// Copyright 2019 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
7package main
8
9type T struct {
10	s   [1]string
11	pad [16]uintptr
12}
13
14//go:noinline
15func f(t *int, p *int) []T {
16	var res []T
17	for {
18		var e *T
19		res = append(res, *e)
20	}
21}
22
23func main() {
24	defer func() {
25		useStack(100) // force a stack copy
26		// We're expecting a panic.
27		// The bug in this issue causes a throw, which this recover() will not squash.
28		recover()
29	}()
30	junk() // fill the stack with invalid pointers
31	f(nil, nil)
32}
33
34func useStack(n int) {
35	if n == 0 {
36		return
37	}
38	useStack(n - 1)
39}
40
41//go:noinline
42func junk() uintptr {
43	var a [128]uintptr // 1k of bad pointers on the stack
44	for i := range a {
45		a[i] = 0xaa
46	}
47	return a[12]
48}
49