diff options
Diffstat (limited to 'test/escape_struct_return.go')
-rw-r--r-- | test/escape_struct_return.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/test/escape_struct_return.go b/test/escape_struct_return.go new file mode 100644 index 0000000..a42ae1e --- /dev/null +++ b/test/escape_struct_return.go @@ -0,0 +1,74 @@ +// errorcheck -0 -m -l + +// Copyright 2015 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. + +// Test escape analysis for function parameters. + +package foo + +var Ssink *string + +type U struct { + _sp *string + _spp **string +} + +func A(sp *string, spp **string) U { // ERROR "leaking param: sp to result ~r0 level=0$" "leaking param: spp to result ~r0 level=0$" + return U{sp, spp} +} + +func B(spp **string) U { // ERROR "leaking param: spp to result ~r0 level=0$" + return U{*spp, spp} +} + +func tA1() { + s := "cat" + sp := &s + spp := &sp + u := A(sp, spp) + _ = u + println(s) +} + +func tA2() { + s := "cat" + sp := &s + spp := &sp + u := A(sp, spp) + println(*u._sp) +} + +func tA3() { + s := "cat" + sp := &s + spp := &sp + u := A(sp, spp) + println(**u._spp) +} + +func tB1() { + s := "cat" + sp := &s + spp := &sp + u := B(spp) + _ = u + println(s) +} + +func tB2() { + s := "cat" + sp := &s + spp := &sp + u := B(spp) + println(*u._sp) +} + +func tB3() { + s := "cat" + sp := &s + spp := &sp + u := B(spp) + println(**u._spp) +} |