Initial commit: Go 1.23 release state
This commit is contained in:
61
test/escape_calls.go
Normal file
61
test/escape_calls.go
Normal file
@@ -0,0 +1,61 @@
|
||||
// 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
|
||||
f = func(ss []string) { got = append(got, ss) } // ERROR "leaking param: ss" "func literal does not escape"
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user