| // 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) | |
| } |