|  | // 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 ~r1 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 literal escapes to heap" | 
|  | } |