| // 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 | |
| var sink *[16]byte | |
| //go:noinline | |
| func use(b []byte, x byte) { | |
| b[0] = x | |
| } | |
| //go:noinline | |
| func single(x byte) [16]byte { | |
| var ret [16]byte | |
| use(ret[:8], x) | |
| use(ret[8:], x+1) | |
| return ret | |
| } | |
| //go:noinline | |
| func addrTaken(x byte) [16]byte { | |
| var ret [16]byte | |
| p := &ret | |
| p[1] = x | |
| return ret | |
| } | |
| //go:noinline | |
| func captured(x byte) [16]byte { | |
| var ret [16]byte | |
| func() { | |
| ret[2] = x | |
| }() | |
| return ret | |
| } | |
| //go:noinline | |
| func multi(x byte, c bool) [16]byte { | |
| var ret [16]byte | |
| ret[4] = x | |
| if c { | |
| return ret | |
| } | |
| ret[5] = x + 1 | |
| return ret | |
| } | |
| //go:noinline | |
| func escaped(x byte, c bool) [16]byte { | |
| var ret [16]byte | |
| ret[3] = x | |
| sink = &ret | |
| if c { | |
| return ret | |
| } | |
| return [16]byte{4: 99} | |
| } | |
| //go:noinline | |
| func partial(x byte, c bool) [16]byte { | |
| var ret [16]byte | |
| ret[6] = x | |
| if c { | |
| return ret | |
| } | |
| return [16]byte{7: 77} | |
| } | |
| //go:noinline | |
| func partialNonCandidateLocal(x byte, c bool) [16]byte { | |
| var ret [16]byte | |
| ret[8] = x | |
| if c { | |
| return ret | |
| } | |
| other := [16]byte{9: 88} | |
| return other | |
| } | |
| func check(name string, got, want [16]byte) { | |
| if got != want { | |
| panic(name) | |
| } | |
| } | |
| func main() { | |
| var want [16]byte | |
| want[0] = 10 | |
| want[8] = 11 | |
| check("single", single(10), want) | |
| want = [16]byte{} | |
| want[1] = 12 | |
| check("addrTaken", addrTaken(12), want) | |
| want = [16]byte{} | |
| want[2] = 13 | |
| check("captured", captured(13), want) | |
| want = [16]byte{} | |
| want[4] = 15 | |
| check("multi true", multi(15, true), want) | |
| want[5] = 16 | |
| check("multi false", multi(15, false), want) | |
| want = [16]byte{} | |
| want[3] = 14 | |
| check("escaped true", escaped(14, true), want) | |
| if *sink != want { | |
| panic("escaped pointer") | |
| } | |
| want = [16]byte{4: 99} | |
| check("escaped false", escaped(14, false), want) | |
| want = [16]byte{} | |
| want[6] = 17 | |
| check("partial true", partial(17, true), want) | |
| want = [16]byte{7: 77} | |
| check("partial false", partial(17, false), want) | |
| want = [16]byte{} | |
| want[8] = 18 | |
| check("partialNonCandidateLocal true", partialNonCandidateLocal(18, true), want) | |
| want = [16]byte{9: 88} | |
| check("partialNonCandidateLocal false", partialNonCandidateLocal(18, false), want) | |
| } |