|  | package main | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "os" | 
|  | ) | 
|  |  | 
|  | type big struct { | 
|  | pile [768]int8 | 
|  | } | 
|  |  | 
|  | type thing struct { | 
|  | name  string | 
|  | next  *thing | 
|  | self  *thing | 
|  | stuff []big | 
|  | } | 
|  |  | 
|  | func test(t *thing, u *thing) { | 
|  | if t.next != nil { | 
|  | return | 
|  | } | 
|  | fmt.Fprintf(os.Stderr, "%s\n", t.name) | 
|  | u.self = u | 
|  | t.self = t | 
|  | t.next = u | 
|  | for _, p := range t.stuff { | 
|  | if isFoo(t, p) { | 
|  | return | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func isFoo(t *thing, b big) bool { | 
|  | return true | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | growstack() // Use stack early to prevent growth during test, which confuses gdb | 
|  | t := &thing{name: "t", self: nil, next: nil, stuff: make([]big, 1)} | 
|  | u := thing{name: "u", self: t, next: t, stuff: make([]big, 1)} | 
|  | test(t, &u) | 
|  | } | 
|  |  | 
|  | var snk string | 
|  |  | 
|  | //go:noinline | 
|  | func growstack() { | 
|  | snk = fmt.Sprintf("%#v,%#v,%#v", 1, true, "cat") | 
|  | } |