// run // Copyright 2014 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 import ( "runtime" "time" ) func main() { c := make(chan bool, 1) go f1(c) <-c time.Sleep(10 * time.Millisecond) go f2(c) <-c } func f1(done chan bool) { defer func() { recover() done <- true runtime.Goexit() // left stack-allocated Panic struct on gp->panic stack }() panic("p") } func f2(done chan bool) { defer func() { recover() done <- true runtime.Goexit() }() time.Sleep(10 * time.Millisecond) // overwrote Panic struct with Timer struct runtime.GC() // walked gp->panic list, found mangled Panic struct, crashed panic("p") }