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  }