| // 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 ~r2 level=0$" "leaking param: spp to result ~r2 level=0$" |
| return U{sp, spp} |
| } |
| |
| func B(spp **string) U { // ERROR "leaking param: spp to result ~r1 level=0$" "leaking param: spp to result ~r1 level=1$" |
| return U{*spp, spp} |
| } |
| |
| func tA1() { |
| s := "cat" |
| sp := &s // ERROR "tA1 &s does not escape$" |
| spp := &sp // ERROR "tA1 &sp does not escape$" |
| u := A(sp, spp) |
| _ = u |
| println(s) |
| } |
| |
| func tA2() { |
| s := "cat" |
| sp := &s // ERROR "tA2 &s does not escape$" |
| spp := &sp // ERROR "tA2 &sp does not escape$" |
| u := A(sp, spp) |
| println(*u._sp) |
| } |
| |
| func tA3() { |
| s := "cat" |
| sp := &s // ERROR "tA3 &s does not escape$" |
| spp := &sp // ERROR "tA3 &sp does not escape$" |
| u := A(sp, spp) |
| println(**u._spp) |
| } |
| |
| func tB1() { |
| s := "cat" |
| sp := &s // ERROR "tB1 &s does not escape$" |
| spp := &sp // ERROR "tB1 &sp does not escape$" |
| u := B(spp) |
| _ = u |
| println(s) |
| } |
| |
| func tB2() { |
| s := "cat" |
| sp := &s // ERROR "tB2 &s does not escape$" |
| spp := &sp // ERROR "tB2 &sp does not escape$" |
| u := B(spp) |
| println(*u._sp) |
| } |
| |
| func tB3() { |
| s := "cat" |
| sp := &s // ERROR "tB3 &s does not escape$" |
| spp := &sp // ERROR "tB3 &sp does not escape$" |
| u := B(spp) |
| println(**u._spp) |
| } |