| // 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. |
| |
| package a |
| |
| import ( |
| "unsafe" |
| ) |
| |
| func recurse(i int, s []byte) byte { |
| s[0] = byte(i) |
| if i == 0 { |
| return s[i] |
| } else { |
| var a [1024]byte |
| r := recurse(i-1, a[:]) |
| return r + a[0] |
| } |
| } |
| |
| //go:uintptrescapes |
| func F1(a uintptr) { |
| var s [16]byte |
| recurse(4096, s[:]) |
| *(*int)(unsafe.Pointer(a)) = 42 |
| } |
| |
| //go:uintptrescapes |
| func F2(a ...uintptr) { |
| var s [16]byte |
| recurse(4096, s[:]) |
| *(*int)(unsafe.Pointer(a[0])) = 42 |
| } |
| |
| type t struct{} |
| |
| func GetT() *t { |
| return &t{} |
| } |
| |
| //go:uintptrescapes |
| func (*t) M1(a uintptr) { |
| var s [16]byte |
| recurse(4096, s[:]) |
| *(*int)(unsafe.Pointer(a)) = 42 |
| } |
| |
| //go:uintptrescapes |
| func (*t) M2(a ...uintptr) { |
| var s [16]byte |
| recurse(4096, s[:]) |
| *(*int)(unsafe.Pointer(a[0])) = 42 |
| } |