1// run 2 3// Copyright 2016 The Go Authors. All rights reserved. 4// Use of this source code is governed by a BSD-style 5// license that can be found in the LICENSE file. 6 7package main 8 9import "fmt" 10 11func f1() (x int) { 12 for { 13 defer func() { 14 recover() 15 x = 1 16 }() 17 panic(nil) 18 } 19} 20 21var sink *int 22 23func f2() (x int) { 24 sink = &x 25 defer func() { 26 recover() 27 x = 1 28 }() 29 panic(nil) 30} 31 32func f3(b bool) (x int) { 33 sink = &x 34 defer func() { 35 recover() 36 x = 1 37 }() 38 if b { 39 panic(nil) 40 } 41 return 42} 43 44func main() { 45 if x := f1(); x != 1 { 46 panic(fmt.Sprintf("f1 returned %d, wanted 1", x)) 47 } 48 if x := f2(); x != 1 { 49 panic(fmt.Sprintf("f2 returned %d, wanted 1", x)) 50 } 51 if x := f3(true); x != 1 { 52 panic(fmt.Sprintf("f3(true) returned %d, wanted 1", x)) 53 } 54 if x := f3(false); x != 1 { 55 panic(fmt.Sprintf("f3(false) returned %d, wanted 1", x)) 56 } 57} 58