go source for verification 2026-05-22
This commit is contained in:
64
test/escape_bloop.go
Normal file
64
test/escape_bloop.go
Normal file
@@ -0,0 +1,64 @@
|
||||
// errorcheck -0 -m
|
||||
|
||||
// Copyright 2026 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 b.Loop escape analysis behavior.
|
||||
|
||||
package bloop
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// An example where mid-stack inlining allows stack allocation of a slice.
|
||||
// This is from the example in go.dev/issue/73137.
|
||||
|
||||
func NewX(x int) []byte { // ERROR "can inline NewX"
|
||||
out := make([]byte, 8) // ERROR "make\(\[\]byte, 8\) escapes to heap"
|
||||
return use1(out)
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func use1(out []byte) []byte { // ERROR "leaking param: out to result ~r0 level=0"
|
||||
return out
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func BenchmarkBloop(b *testing.B) { // ERROR "leaking param: b"
|
||||
for b.Loop() { // ERROR "inlining call to testing.\(\*B\).Loop"
|
||||
NewX(42) // ERROR "make\(\[\]byte, 8\) does not escape" "inlining call to NewX"
|
||||
}
|
||||
}
|
||||
|
||||
// A traditional b.N benchmark using a sink variable for comparison,
|
||||
// also from the example in go.dev/issue/73137.
|
||||
|
||||
var sink byte
|
||||
|
||||
//go:noinline
|
||||
func BenchmarkBN(b *testing.B) { // ERROR "b does not escape"
|
||||
for i := 0; i < b.N; i++ {
|
||||
out := NewX(42) // ERROR "make\(\[\]byte, 8\) does not escape" "inlining call to NewX"
|
||||
sink = out[0]
|
||||
}
|
||||
}
|
||||
|
||||
// An example showing behavior of a simple function argument in the b.Loop body.
|
||||
|
||||
//go:noinline
|
||||
func use2(x any) {} // ERROR "x does not escape"
|
||||
|
||||
//go:noinline
|
||||
func BenchmarkBLoopFunctionArg(b *testing.B) { // ERROR "leaking param: b"
|
||||
for b.Loop() { // ERROR "inlining call to testing.\(\*B\).Loop"
|
||||
use2(42) // ERROR "42 does not escape"
|
||||
}
|
||||
}
|
||||
|
||||
// A similar call outside of b.Loop for comparison.
|
||||
|
||||
func simpleFunctionArg() { // ERROR "can inline simpleFunctionArg"
|
||||
use2(42) // ERROR "42 does not escape"
|
||||
}
|
||||
Reference in New Issue
Block a user