1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package a
6
7import (
8	"unsafe"
9)
10
11func recurse(i int, s []byte) byte {
12	s[0] = byte(i)
13	if i == 0 {
14		return s[i]
15	} else {
16		var a [1024]byte
17		r := recurse(i-1, a[:])
18		return r + a[0]
19	}
20}
21
22//go:uintptrescapes
23func F1(a uintptr) {
24	var s [16]byte
25	recurse(4096, s[:])
26	*(*int)(unsafe.Pointer(a)) = 42
27}
28
29//go:uintptrescapes
30func F2(a ...uintptr) {
31	var s [16]byte
32	recurse(4096, s[:])
33	*(*int)(unsafe.Pointer(a[0])) = 42
34}
35
36type t struct{}
37
38func GetT() *t {
39	return &t{}
40}
41
42//go:uintptrescapes
43func (*t) M1(a uintptr) {
44	var s [16]byte
45	recurse(4096, s[:])
46	*(*int)(unsafe.Pointer(a)) = 42
47}
48
49//go:uintptrescapes
50func (*t) M2(a ...uintptr) {
51	var s [16]byte
52	recurse(4096, s[:])
53	*(*int)(unsafe.Pointer(a[0])) = 42
54}
55