package foo
-import "runtime"
+import (
+ "runtime"
+ "unsafe"
+)
func noleak(p *int) int { // ERROR "p does not escape"
return *p
}
func f3() {
- var x int // ERROR "moved to heap: x"
+ var x int // ERROR "moved to heap: x"
p := leaktoret(&x)
gp = p
}
func f4() {
- var x int // ERROR "moved to heap: x"
+ var x int // ERROR "moved to heap: x"
p, q := leaktoret2(&x)
gp = p
gp = q
}
func f6() {
- var x int // ERROR "moved to heap: x"
+ var x int // ERROR "moved to heap: x"
px1, px2 := leaktoret22(leaktoret2(&x))
gp = px1
_ = px2
x := 1
f29000(2, x) // ERROR "x escapes to heap"
}
+
+// Issue 28369: taking an address of a parameter and converting it into a uintptr causes an
+// unnecessary escape.
+
+var sink28369 uintptr
+
+func f28369(n int) int {
+ if n == 0 {
+ sink28369 = uintptr(unsafe.Pointer(&n))
+ return n
+ }
+
+ return 1 + f28369(n-1)
+}