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