1package main 2 3import ( 4 "fmt" 5 "os" 6) 7 8type big struct { 9 pile [768]int8 10} 11 12type thing struct { 13 name string 14 next *thing 15 self *thing 16 stuff []big 17} 18 19func test(t *thing, u *thing) { 20 if t.next != nil { 21 return 22 } 23 fmt.Fprintf(os.Stderr, "%s\n", t.name) 24 u.self = u 25 t.self = t 26 t.next = u 27 for _, p := range t.stuff { 28 if isFoo(t, p) { 29 return 30 } 31 } 32} 33 34//go:noinline 35func isFoo(t *thing, b big) bool { 36 return true 37} 38 39func main() { 40 growstack() // Use stack early to prevent growth during test, which confuses gdb 41 t := &thing{name: "t", self: nil, next: nil, stuff: make([]big, 1)} 42 u := thing{name: "u", self: t, next: t, stuff: make([]big, 1)} 43 test(t, &u) 44} 45 46var snk string 47 48//go:noinline 49func growstack() { 50 snk = fmt.Sprintf("%#v,%#v,%#v", 1, true, "cat") 51} 52