blob: cd8a97ce7a3f5e972f5956869aecf3e80bdd3887 [file] [edit]
// run
// 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.
package main
import "runtime"
func main() {
runtime.GOMAXPROCS(2)
c := make(chan bool)
for i := 0; i < 16; i++ {
go func() {
var b []byte
for range 100000 {
f(&b)
}
c <- true
}()
}
for i := 0; i < 16; i++ {
<-c
}
}
var n int = 64 // constant, but the compiler doesn't know that
//go:noinline
func f(sink *[]byte) {
useStack(64) // Use 64KB of stack, so that shrinking might happen below.
x := make([]int, n, 128) // on stack
_ = append(x, make([]int, 128-n)...) // memclrNoHeapPointersPreemptible call is here
*sink = make([]byte, 1024) // make some garbage to cause GC
}
//go:noinline
func useStack(depth int) {
var b [128]int
if depth == b[depth%len(b)] { // depth == 0
return
}
useStack(depth - 1)
}