github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/test/execution/defer.go (about) 1 // 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 29 package main 30 31 type T struct { 32 value int 33 } 34 35 type T1 struct { 36 T 37 } 38 39 func (t T) abc() { 40 println(t.value) 41 } 42 43 func (t *T) def() { 44 println(t.value) 45 } 46 47 func (t *T) ghi(v int) { 48 println(v) 49 } 50 51 func printerr(err interface{}) { 52 if err != nil { 53 println("recovered:", err.(string)) 54 } else { 55 println("recovered no error") 56 } 57 } 58 59 func f6() { 60 defer func() { printerr(recover()) }() 61 defer func() { panic("second") }() 62 panic("first") 63 } 64 65 func 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 85 func 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 98 func f3() (a int) { 99 defer func() { a *= 2 }() 100 f4() 101 return 123 102 } 103 104 func 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 111 func f1() { 112 defer func() { println("f1.2") }() 113 defer func() { println("f1.1") }() 114 f2() 115 } 116 117 func builtins() { 118 defer println("ahoy") 119 } 120 121 func main() { 122 f1() 123 f6() 124 builtins() 125 }