]> Cypherpunks.ru repositories - gostls13.git/blob - test/defererrcheck.go
cmd/compile: disable open-coded defers on riscv64
[gostls13.git] / test / defererrcheck.go
1 // errorcheck -0 -l -d=defer
2 // +build !riscv64
3
4 // Copyright 2019 The Go Authors. All rights reserved.
5 // Use of this source code is governed by a BSD-style
6 // license that can be found in the LICENSE file.
7
8 // check that open-coded defers are used in expected situations
9
10 // TODO(jsing): Re-enable on riscv64 once open-coded defers are turned
11 // back on - see golang.org/issue/36786
12
13 package main
14
15 import "fmt"
16
17 var glob = 3
18
19 func f1() {
20
21         for i := 0; i < 10; i++ {
22                 fmt.Println("loop")
23         }
24         defer func() { // ERROR "open-coded defer"
25                 fmt.Println("defer")
26         }()
27 }
28
29 func f2() {
30         for {
31                 defer func() { // ERROR "heap-allocated defer"
32                         fmt.Println("defer1")
33                 }()
34                 if glob > 2 {
35                         break
36                 }
37         }
38         defer func() { // ERROR "stack-allocated defer"
39                 fmt.Println("defer2")
40         }()
41 }
42
43 func f3() {
44         defer func() { // ERROR "stack-allocated defer"
45                 fmt.Println("defer2")
46         }()
47         for {
48                 defer func() { // ERROR "heap-allocated defer"
49                         fmt.Println("defer1")
50                 }()
51                 if glob > 2 {
52                         break
53                 }
54         }
55 }
56
57 func f4() {
58         defer func() { // ERROR "open-coded defer"
59                 fmt.Println("defer")
60         }()
61 label:
62         fmt.Println("goto loop")
63         if glob > 2 {
64                 goto label
65         }
66 }
67
68 func f5() {
69 label:
70         fmt.Println("goto loop")
71         defer func() { // ERROR "heap-allocated defer"
72                 fmt.Println("defer")
73         }()
74         if glob > 2 {
75                 goto label
76         }
77 }
78
79 func f6() {
80 label:
81         fmt.Println("goto loop")
82         if glob > 2 {
83                 goto label
84         }
85         // The current analysis doesn't end a backward goto loop, so this defer is
86         // considered to be inside a loop
87         defer func() { // ERROR "heap-allocated defer"
88                 fmt.Println("defer")
89         }()
90 }