2024-09-21 23:49:08 +10:00
// 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.
// In this test almost everything is BAD except the simplest cases
// where input directly flows to output.
package foo
func f ( buf [ ] byte ) [ ] byte { // ERROR "leaking param: buf to result ~r0 level=0$"
return buf
}
func g ( * byte ) string
func h ( e int ) {
var x [ 32 ] byte // ERROR "moved to heap: x$"
g ( & f ( x [ : ] ) [ 0 ] )
}
type Node struct {
s string
left , right * Node
}
func walk ( np * * Node ) int { // ERROR "leaking param content: np"
n := * np
w := len ( n . s )
if n == nil {
return 0
}
wl := walk ( & n . left )
wr := walk ( & n . right )
if wl < wr {
n . left , n . right = n . right , n . left // ERROR "ignoring self-assignment"
wl , wr = wr , wl
}
* np = n
return w + wl + wr
}
// Test for bug where func var f used prototype's escape analysis results.
func prototype ( xyz [ ] string ) { } // ERROR "xyz does not escape"
func bar ( ) {
var got [ ] [ ] string
f := prototype
2025-08-13 21:50:03 +07:00
f = func ( ss [ ] string ) { got = append ( got , ss ) } // ERROR "leaking param: ss" "func literal does not escape" "append escapes to heap"
2024-09-21 23:49:08 +10:00
s := "string"
f ( [ ] string { s } ) // ERROR "\[\]string{...} escapes to heap"
}
func strmin ( a , b , c string ) string { // ERROR "leaking param: a to result ~r0 level=0" "leaking param: b to result ~r0 level=0" "leaking param: c to result ~r0 level=0"
return min ( a , b , c )
}
func strmax ( a , b , c string ) string { // ERROR "leaking param: a to result ~r0 level=0" "leaking param: b to result ~r0 level=0" "leaking param: c to result ~r0 level=0"
return max ( a , b , c )
}