// errorcheck -0 -m -l -newescape=false // 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 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) }