diff options
Diffstat (limited to 'test/escape_closure.go')
-rw-r--r-- | test/escape_closure.go | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/test/escape_closure.go b/test/escape_closure.go index 4cdb06e4c5..f36073e7d0 100644 --- a/test/escape_closure.go +++ b/test/escape_closure.go @@ -145,3 +145,29 @@ func ClosureCallArgs15() { // BAD: p should not escape here }(&p) // ERROR "&p escapes to heap" "\(func literal\)\(&p\) escapes to heap" } + +func ClosureLeak1(s string) string { // ERROR "ClosureLeak1 s does not escape" + t := s + "YYYY" // ERROR "escapes to heap" + return ClosureLeak1a(t) // ERROR "ClosureLeak1 ... argument does not escape" +} + +// See #14409 -- returning part of captured var leaks it. +func ClosureLeak1a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1" + return func() string { // ERROR "ClosureLeak1a func literal does not escape" + return a[0] + }() +} + +func ClosureLeak2(s string) string { // ERROR "ClosureLeak2 s does not escape" + t := s + "YYYY" // ERROR "escapes to heap" + c := ClosureLeak2a(t) // ERROR "ClosureLeak2 ... argument does not escape" + return c +} +func ClosureLeak2a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1" + return ClosureLeak2b(func() string { // ERROR "ClosureLeak2a func literal does not escape" + return a[0] + }) +} +func ClosureLeak2b(f func() string) string { // ERROR "leaking param: f to result ~r1 level=1" + return f() +} |