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