blob: ba1b63217b8e4fabce705f88697576a148507c4f [file] [log] [blame]
Peter Collingbournead9841e2014-11-27 00:06:42 +00001// RUN: llgo -o %t %s
2// RUN: %t 2>&1 | FileCheck %s
3
4// CHECK: f2.1
5// CHECK-NEXT: f5
6// CHECK-NEXT: recovered no error
7// CHECK-NEXT: f5
8// CHECK-NEXT: recovered: meep meep
9// CHECK-NEXT: 888
10// CHECK-NEXT: f5
11// CHECK-NEXT: recovered no error
12// CHECK-NEXT: f5
13// CHECK-NEXT: recovered no error
14// CHECK-NEXT: 888
15// CHECK-NEXT: 456
16// CHECK-NEXT: 999
17// CHECK-NEXT: 999
18// CHECK-NEXT: 123
19// CHECK-NEXT: 999
20// CHECK-NEXT: 999
21// CHECK-NEXT: 246
22// CHECK-NEXT: f2.2
23// CHECK-NEXT: f2.3
24// CHECK-NEXT: f1.1
25// CHECK-NEXT: f1.2
26// CHECK-NEXT: recovered: second
27// CHECK-NEXT: ahoy
28
29package main
30
31type T struct {
32 value int
33}
34
35type T1 struct {
36 T
37}
38
39func (t T) abc() {
40 println(t.value)
41}
42
43func (t *T) def() {
44 println(t.value)
45}
46
47func (t *T) ghi(v int) {
48 println(v)
49}
50
51func printerr(err interface{}) {
52 if err != nil {
53 println("recovered:", err.(string))
54 } else {
55 println("recovered no error")
56 }
57}
58
59func f6() {
60 defer func() { printerr(recover()) }()
61 defer func() { panic("second") }()
62 panic("first")
63}
64
65func f5(panic_ bool) {
66 var t1 T1
67 t1.T.value = 888
68 defer t1.abc()
69 var f func(int)
70 f = func(recursion int) {
71 if recursion > 0 {
72 f(recursion - 1)
73 return
74 }
75 println("f5")
76 printerr(recover())
77 }
78 defer f(0) // will recover (after f(1))
79 defer f(1) // won't recover
80 if panic_ {
81 panic("meep meep")
82 }
83}
84
85func f4() {
86 var a T = T{999}
87 var b *T = &a
88 defer a.abc()
89 defer a.def()
90 defer a.ghi(123)
91 defer b.abc()
92 defer b.def()
93 defer b.ghi(456)
94 f5(true)
95 f5(false) // verify the recover in f5 works
96}
97
98func f3() (a int) {
99 defer func() { a *= 2 }()
100 f4()
101 return 123
102}
103
104func f2() {
105 defer func() { println("f2.3") }()
106 defer func(s string) { println(s) }("f2.2")
107 println("f2.1")
108 println(f3())
109}
110
111func f1() {
112 defer func() { println("f1.2") }()
113 defer func() { println("f1.1") }()
114 f2()
115}
116
117func builtins() {
118 defer println("ahoy")
119}
120
121func main() {
122 f1()
123 f6()
124 builtins()
125}