| // errorcheck -0 -m -l |
| |
| // Copyright 2025 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. |
| |
| // Tests for escaping variable-sized allocations. |
| // In particular, we need to make sure things assigned into |
| // variable-sized allocations escape even when the variable-sized |
| // allocations themselves don't escape. |
| |
| package foo |
| |
| type T string |
| |
| func f1(n int, v T) { // ERROR "leaking param: v" |
| s := make([]T, n) // ERROR "make\(\[\]T, n\) does not escape" |
| s[0] = v |
| g(s) |
| } |
| |
| func f2(n int, v T) { // ERROR "leaking param: v" |
| s := make([]T, n) // ERROR "make\(\[\]T, n\) does not escape" |
| p := &s[0] |
| *p = v |
| g(s) |
| } |
| |
| func f3(n int, v T) { // ERROR "leaking param: v" |
| s := make([]T, n) // ERROR "make\(\[\]T, n\) does not escape" |
| t := (*[4]T)(s) |
| t[0] = v |
| g(s) |
| } |
| |
| // TODO: imprecise: this does not need to leak v. |
| func f4(v T) { // ERROR "leaking param: v" |
| s := make([]T, 4) // ERROR "make\(\[\]T, 4\) does not escape" |
| s[0] = v |
| g(s) |
| } |
| |
| // TODO: imprecise: this does not need to leak v. |
| func f5(v T) { // ERROR "leaking param: v" |
| var b [4]T |
| s := b[:] |
| s[0] = v |
| g(s) |
| } |
| |
| func f6(v T) { // ERROR "v does not escape" |
| var b [4]T |
| s := b[:] |
| b[0] = v |
| g(s) |
| } |
| |
| func g(s []T) { // ERROR "s does not escape" |
| } |