| // run |
| |
| // Copyright 2021 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 "fmt" |
| |
| type T [8]*int |
| |
| //go:noinline |
| func f(x int) T { |
| return T{} |
| } |
| |
| //go:noinline |
| func g(x int, t T) { |
| if t != (T{}) { |
| panic(fmt.Sprintf("bad: %v", t)) |
| } |
| } |
| |
| func main() { |
| const N = 10000 |
| var q T |
| func() { |
| for i := 0; i < N; i++ { |
| q = f(0) |
| g(0, q) |
| sink = make([]byte, 1024) |
| } |
| }() |
| // Note that the closure is a trick to get the write to q to be a |
| // write to a pointer that is known to be non-nil and requires |
| // a write barrier. |
| } |
| |
| var sink []byte |