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