src.Op == ONAME && src.Class() == PPARAM && src.Esc&EscMask < EscHeap &&
level.int() > 0 {
src.Esc = escMax(EscContentEscapes|src.Esc, EscNone)
- if Debug['m'] != 0 {
- Warnl(src.Pos, "mark escaped content: %S", src)
- step.describe(src)
- }
}
leaks = level.int() <= 0 && level.guaranteedDereference() <= 0 && dstE.Loopdepth < modSrcLoopdepth
// Treat a captured closure variable as equivalent to the
// original variable.
if src.IsClosureVar() {
- if leaks && Debug['m'] != 0 {
- Warnl(src.Pos, "leaking closure reference %S", src)
- step.describe(src)
- }
e.escwalk(level, dst, src.Name.Defn, e.stepWalk(dst, src.Name.Defn, "closure-var", step))
}
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo124 func literal does not escape$"
- *x = p // ERROR "leaking closure reference p$"
+ *x = p
}()
}
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo125 func literal does not escape$"
- ch <- p // ERROR "leaking closure reference p$"
+ ch <- p
}()
}
// loopdepth 1
var i int // ERROR "moved to heap: i$"
func() { // ERROR "foo126 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i"
+ px = &i
}()
}
_ = px
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo129 func literal does not escape$"
- q := p // ERROR "leaking closure reference p$"
+ q := p
func() { // ERROR "foo129.func1 func literal does not escape$"
- r := q // ERROR "leaking closure reference q$"
+ r := q
px = r
}()
}()
for {
var i int // ERROR "moved to heap: i$"
func() { // ERROR "foo130 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
}
func foo131() {
var i int // ERROR "moved to heap: i$"
func() { // ERROR "foo131 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
func foo132() {
var i int // ERROR "moved to heap: i$"
go func() { // ERROR "func literal escapes to heap$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
func foo133() {
var i int // ERROR "moved to heap: i$"
defer func() { // ERROR "foo133 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
var i int // ERROR "moved to heap: i$"
p := &i
go func() { // ERROR "func literal escapes to heap$"
- q := p // ERROR "leaking closure reference p$"
+ q := p
func() { // ERROR "foo136.func1 func literal does not escape$"
- r := q // ERROR "leaking closure reference q$"
+ r := q
px = r
}()
}()
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo137 func literal does not escape$"
- q := p // ERROR "leaking closure reference p$"
+ q := p
go func() { // ERROR "func literal escapes to heap$"
r := q
_ = r
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo124 func literal does not escape$"
- *x = p // ERROR "leaking closure reference p$"
+ *x = p
}()
}
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo125 func literal does not escape$"
- ch <- p // ERROR "leaking closure reference p$"
+ ch <- p
}()
}
// loopdepth 1
var i int // ERROR "moved to heap: i$"
func() { // ERROR "foo126 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i"
+ px = &i
}()
}
_ = px
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo129 func literal does not escape$"
- q := p // ERROR "leaking closure reference p$"
+ q := p
func() { // ERROR "foo129.func1 func literal does not escape$"
- r := q // ERROR "leaking closure reference q$"
+ r := q
px = r
}()
}()
for {
var i int // ERROR "moved to heap: i$"
func() { // ERROR "foo130 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
}
func foo131() {
var i int // ERROR "moved to heap: i$"
func() { // ERROR "foo131 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
func foo132() {
var i int // ERROR "moved to heap: i$"
go func() { // ERROR "func literal escapes to heap$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
func foo133() {
var i int // ERROR "moved to heap: i$"
defer func() { // ERROR "foo133 func literal does not escape$"
- px = &i // ERROR "leaking closure reference i$"
+ px = &i
}()
}
var i int // ERROR "moved to heap: i$"
p := &i
go func() { // ERROR "func literal escapes to heap$"
- q := p // ERROR "leaking closure reference p$"
+ q := p
func() { // ERROR "foo136.func1 func literal does not escape$"
- r := q // ERROR "leaking closure reference q$"
+ r := q
px = r
}()
}()
var i int // ERROR "moved to heap: i$"
p := &i
func() { // ERROR "foo137 func literal does not escape$"
- q := p // ERROR "leaking closure reference p$"
+ q := p
go func() { // ERROR "func literal escapes to heap$"
r := q
_ = r
func tbff1() *string {
a := "cat"
- b := "dog" // ERROR "moved to heap: b$"
+ b := "dog" // ERROR "moved to heap: b$"
u := bff(&a, &b)
_ = u[0]
return &b
// BAD: need fine-grained analysis to track u[0] and u[1] differently.
func tbff2() *string {
- a := "cat" // ERROR "moved to heap: a$"
- b := "dog" // ERROR "moved to heap: b$"
+ a := "cat" // ERROR "moved to heap: a$"
+ b := "dog" // ERROR "moved to heap: b$"
u := bff(&a, &b)
_ = u[0]
return u[1]
// pointers stored in small array literals do not escape;
// large array literals are heap allocated;
// pointers stored in large array literals escape.
-func hugeLeaks1(x **string, y **string) { // ERROR "leaking param content: x" "hugeLeaks1 y does not escape" "mark escaped content: x"
+func hugeLeaks1(x **string, y **string) { // ERROR "leaking param content: x" "hugeLeaks1 y does not escape"
a := [10]*string{*y}
_ = a
// 4 x 4,000,000 exceeds MaxStackVarSize, therefore it must be heap allocated if pointers are 4 bytes or larger.