vxx2 / vlib / v / gen / c / testdata / autofree_labeled_continue_boehm_leak.vv
116 lines · 106 sloc · 2.26 KB · 1a2d0e5b70d6dd1baaa60290f2446e9ece4324bf
Raw
1// vtest vflags: -autofree -gc boehm_leak
2
3fn make_label(n int) string {
4 return 'x'.repeat(n)
5}
6
7fn labeled_continue_cleanup() {
8 outer: for _ in 0 .. 1 {
9 target := make_label(7)
10 defer {
11 assert target.len == 7
12 }
13 {
14 inner := make_label(3)
15 assert inner.len == 3
16 continue outer
17 }
18 after := make_label(5)
19 defer {
20 assert after.len == 5
21 }
22 }
23}
24
25fn for_c_init_cleanup() {
26 mut i := 0
27 outer: for init := make_label(4); i < 2; i++ {
28 assert init.len == 4
29 body := make_label(5 + i)
30 assert body.len >= 5
31 if i == 0 {
32 continue outer
33 }
34 break outer
35 }
36}
37
38fn for_c_init_return_cleanup() int {
39 mut i := 0
40 for init := make_label(4); i < 1; i++ {
41 assert init.len == 4
42 body := make_label(5)
43 assert body.len == 5
44 return body.len
45 }
46 return 0
47}
48
49fn for_c_multi_init_return_cleanup() int {
50 mut i := 0
51 for first, second := make_label(4), make_label(3); i < 1; i++ {
52 assert first.len + second.len == 7
53 body := make_label(5)
54 assert body.len == 5
55 return body.len
56 }
57 return 0
58}
59
60fn for_c_return_init_string() string {
61 mut i := 0
62 for init := make_label(6); i < 1; i++ {
63 body := make_label(5)
64 assert body.len == 5
65 return init
66 }
67 return ''
68}
69
70fn for_c_multi_init_return_second_string() string {
71 mut i := 0
72 for first, second := make_label(4), make_label(3); i < 1; i++ {
73 assert first.len == 4
74 body := make_label(5)
75 assert body.len == 5
76 return second
77 }
78 return ''
79}
80
81fn for_c_branch_return_body_after_init_path(cond bool) string {
82 mut i := 0
83 for init := make_label(4); i < 1; i++ {
84 if cond {
85 return init
86 }
87 body := make_label(5)
88 return body
89 }
90 return ''
91}
92
93fn for_c_multi_init_branch_return_body_after_second_path(cond bool) string {
94 mut i := 0
95 for first, second := make_label(4), make_label(3); i < 1; i++ {
96 assert first.len == 4
97 if cond {
98 return second
99 }
100 body := make_label(5)
101 return body
102 }
103 return ''
104}
105
106fn main() {
107 labeled_continue_cleanup()
108 for_c_init_cleanup()
109 assert for_c_init_return_cleanup() == 5
110 assert for_c_multi_init_return_cleanup() == 5
111 assert for_c_return_init_string() == 'xxxxxx'
112 assert for_c_multi_init_return_second_string() == 'xxx'
113 assert for_c_branch_return_body_after_init_path(false) == 'xxxxx'
114 assert for_c_multi_init_branch_return_body_after_second_path(false) == 'xxxxx'
115 gc_check_leaks()
116}
117