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