|  | // 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 | 
|  | } |