| // errorcheck -0 -m |
| |
| // 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. |
| |
| package escape |
| |
| const globalConstSize = 128 |
| |
| var globalVarSize = 128 |
| |
| //go:noinline |
| func testSlices() { |
| { |
| size := 128 |
| _ = make([]byte, size) // ERROR "make\(\[\]byte, 128\) does not escape" |
| } |
| |
| { |
| s := 128 |
| size := s |
| _ = make([]byte, size) // ERROR "make\(\[\]byte, 128\) does not escape" |
| } |
| |
| { |
| size := 128 |
| _ = make([]byte, size) // ERROR "make\(\[\]byte, 128\) does not escape" |
| } |
| |
| { |
| s := 128 |
| size := s |
| _ = make([]byte, size) // ERROR "make\(\[\]byte, 128\) does not escape" |
| } |
| |
| { |
| s1 := 128 |
| s2 := 256 |
| _ = make([]byte, s2, s1) // ERROR "make\(\[\]byte, s2, 128\) does not escape" |
| } |
| |
| allocLen(256) // ERROR "make\(\[\]byte, 256\) does not escape" "inlining call" |
| allocCap(256) // ERROR "make\(\[\]byte, 0, 256\) does not escape" "inlining call" |
| _ = newT(256) // ERROR "make\(\[\]byte, 256\) does not escape" "inlining call" |
| |
| { |
| size := globalConstSize |
| _ = make([]byte, size) // ERROR "make\(\[\]byte, 128\) does not escape" |
| } |
| |
| allocLen(globalConstSize) // ERROR "make\(\[\]byte, 128\) does not escape" "inlining call" |
| allocCap(globalConstSize) // ERROR "make\(\[\]byte, 0, 128\) does not escape" "inlining call" |
| _ = newT(globalConstSize) // ERROR "make\(\[\]byte, 128\) does not escape" "inlining call" |
| |
| { |
| c := 128 |
| s := 256 |
| _ = make([]byte, s, c) // ERROR "make\(\[\]byte, s, 128\) does not escape" |
| } |
| |
| { |
| s := 256 |
| _ = make([]byte, s, globalConstSize) // ERROR "make\(\[\]byte, s, 128\) does not escape" |
| } |
| |
| { |
| _ = make([]byte, globalVarSize) // ERROR "make\(\[\]byte, globalVarSize\) does not escape" |
| _ = make([]byte, globalVarSize, globalConstSize) // ERROR "make\(\[\]byte, globalVarSize, 128\) does not escape" |
| } |
| } |
| |
| func allocLen(l int) []byte { // ERROR "can inline" |
| return make([]byte, l) // ERROR "escapes to heap" |
| } |
| |
| func allocCap(l int) []byte { // ERROR "can inline" |
| return make([]byte, 0, l) // ERROR "escapes to heap" |
| } |
| |
| type t struct { |
| s []byte |
| } |
| |
| func newT(l int) t { // ERROR "can inline" |
| return t{make([]byte, l)} // ERROR "make.*escapes to heap" |
| } |
| |
| //go:noinline |
| func testMaps() { |
| size := 128 |
| _ = make(map[string]int, size) // ERROR "does not escape" |
| |
| _ = allocMapLen(128) // ERROR "does not escape" "inlining call" |
| _ = newM(128) // ERROR "does not escape" "inlining call" |
| } |
| |
| func allocMapLen(l int) map[string]int { // ERROR "can inline" |
| return make(map[string]int, l) // ERROR "escapes to heap" |
| } |
| |
| type m struct { |
| m map[string]int |
| } |
| |
| func newM(l int) m { // ERROR "can inline" |
| return m{make(map[string]int, l)} // ERROR "make.*escapes to heap" |
| } |