| // 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. | |
| // This tests an SSA-able stack temporary whose address must refer to its stack | |
| // slot. Without the addrtaken mark, (*state).addr returns &runtime.zerobase and | |
| // runtime.deferprocStack follows a corrupted _defer record. | |
| // | |
| // On 64-bit systems, runtime._defer is 48 bytes with 7 fields and fits the | |
| // current SSA limits. Nine defers force the non-open-coded deferprocStack path. | |
| package main | |
| var n int | |
| func sink() { n++ } | |
| //go:noinline | |
| func nineDefers() { | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| defer sink() | |
| } | |
| func main() { | |
| nineDefers() | |
| if n != 9 { | |
| println("n =", n, "want 9") | |
| panic("defer chain corrupted") | |
| } | |
| } |