| // 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) |
| } |