Skip to content

Commit 0258482

Browse files
authored
cgen: auto eq method for sumtype (#9408)
1 parent e5a6983 commit 0258482

File tree

7 files changed

+362
-167
lines changed

7 files changed

+362
-167
lines changed

vlib/v/checker/checker.v

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -741,15 +741,16 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
741741
else {}
742742
}
743743
}
744+
eq_ne := infix_expr.op in [.eq, .ne]
744745
// Single side check
745746
// Place these branches according to ops' usage frequency to accelerate.
746747
// TODO: First branch includes ops where single side check is not needed, or needed but hasn't been implemented.
747748
// TODO: Some of the checks are not single side. Should find a better way to organize them.
748749
match infix_expr.op {
749750
// .eq, .ne, .gt, .lt, .ge, .le, .and, .logical_or, .dot, .key_as, .right_shift {}
750751
.eq, .ne {
751-
is_mismatch := (left.kind == .alias && right.kind in [.struct_, .array])
752-
|| (right.kind == .alias && left.kind in [.struct_, .array])
752+
is_mismatch := (left.kind == .alias && right.kind in [.struct_, .array, .sum_type])
753+
|| (right.kind == .alias && left.kind in [.struct_, .array, .sum_type])
753754
if is_mismatch {
754755
c.error('possible type mismatch of compared values of `$infix_expr.op` operation',
755756
left_right_pos)
@@ -996,7 +997,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
996997
// TODO broken !in
997998
c.error('string types only have the following operators defined: `==`, `!=`, `<`, `>`, `<=`, `>=`, and `+`',
998999
infix_expr.pos)
999-
} else if left.kind == .enum_ && right.kind == .enum_ && infix_expr.op !in [.ne, .eq] {
1000+
} else if left.kind == .enum_ && right.kind == .enum_ && !eq_ne {
10001001
left_enum := left.info as table.Enum
10011002
right_enum := right.info as table.Enum
10021003
if left_enum.is_flag && right_enum.is_flag {
@@ -1011,10 +1012,11 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
10111012
infix_expr.pos)
10121013
}
10131014
}
1014-
// sum types can't have any infix operation except of "is", is is checked before and doesn't reach this
1015-
if c.table.type_kind(left_type) == .sum_type {
1015+
// sum types can't have any infix operation except of `is`, `eq`, `ne`.
1016+
// `is` is checked before and doesn't reach this.
1017+
if c.table.type_kind(left_type) == .sum_type && !eq_ne {
10161018
c.error('cannot use operator `$infix_expr.op` with `$left.name`', infix_expr.pos)
1017-
} else if c.table.type_kind(right_type) == .sum_type {
1019+
} else if c.table.type_kind(right_type) == .sum_type && !eq_ne {
10181020
c.error('cannot use operator `$infix_expr.op` with `$right.name`', infix_expr.pos)
10191021
}
10201022
// TODO move this to symmetric_check? Right now it would break `return 0` for `fn()?int `
Lines changed: 127 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,139 @@
1-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:10:10: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
2-
8 |
3-
9 | fn main() {
4-
10 | println(Aaa{} == 10)
5-
| ~~~~~~~~~~~
6-
11 | println(10 == Aaa{})
7-
12 | println(Aaa{} != 10)
8-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:11:10: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
9-
9 | fn main() {
10-
10 | println(Aaa{} == 10)
11-
11 | println(10 == Aaa{})
12-
| ~~~~~~~~~~~
13-
12 | println(Aaa{} != 10)
14-
13 | println(10 != Aaa{})
151
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:12:10: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
16-
10 | println(Aaa{} == 10)
17-
11 | println(10 == Aaa{})
18-
12 | println(Aaa{} != 10)
2+
10 |
3+
11 | fn main() {
4+
12 | println(Aaa{} == 10)
195
| ~~~~~~~~~~~
20-
13 | println(10 != Aaa{})
21-
14 |
6+
13 | println(10 == Aaa{})
7+
14 | println(Aaa{} != 10)
228
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:13:10: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
23-
11 | println(10 == Aaa{})
24-
12 | println(Aaa{} != 10)
25-
13 | println(10 != Aaa{})
9+
11 | fn main() {
10+
12 | println(Aaa{} == 10)
11+
13 | println(10 == Aaa{})
12+
| ~~~~~~~~~~~
13+
14 | println(Aaa{} != 10)
14+
15 | println(10 != Aaa{})
15+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:14:10: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
16+
12 | println(Aaa{} == 10)
17+
13 | println(10 == Aaa{})
18+
14 | println(Aaa{} != 10)
19+
| ~~~~~~~~~~~
20+
15 | println(10 != Aaa{})
21+
16 |
22+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:15:10: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
23+
13 | println(10 == Aaa{})
24+
14 | println(Aaa{} != 10)
25+
15 | println(10 != Aaa{})
2626
| ~~~~~~~~~~~
27-
14 |
28-
15 | println(Aaa{0} == AAaa{0})
29-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:15:10: error: possible type mismatch of compared values of `==` operation
30-
13 | println(10 != Aaa{})
31-
14 |
32-
15 | println(Aaa{0} == AAaa{0})
27+
16 |
28+
17 | println(Aaa{0} == AAaa{0})
29+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:17:10: error: possible type mismatch of compared values of `==` operation
30+
15 | println(10 != Aaa{})
31+
16 |
32+
17 | println(Aaa{0} == AAaa{0})
3333
| ~~~~~~~~~~~~~~~~~
34-
16 | println(AAaa{0} == Aaa{0})
35-
17 | println(AAaa{1} != Aaa{1})
36-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:16:10: error: possible type mismatch of compared values of `==` operation
37-
14 |
38-
15 | println(Aaa{0} == AAaa{0})
39-
16 | println(AAaa{0} == Aaa{0})
34+
18 | println(AAaa{0} == Aaa{0})
35+
19 | println(AAaa{1} != Aaa{1})
36+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:18:10: error: possible type mismatch of compared values of `==` operation
37+
16 |
38+
17 | println(Aaa{0} == AAaa{0})
39+
18 | println(AAaa{0} == Aaa{0})
4040
| ~~~~~~~~~~~~~~~~~
41-
17 | println(AAaa{1} != Aaa{1})
42-
18 | println(Aaa{1} != AAaa{1})
43-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:17:10: error: possible type mismatch of compared values of `!=` operation
44-
15 | println(Aaa{0} == AAaa{0})
45-
16 | println(AAaa{0} == Aaa{0})
46-
17 | println(AAaa{1} != Aaa{1})
41+
19 | println(AAaa{1} != Aaa{1})
42+
20 | println(Aaa{1} != AAaa{1})
43+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:19:10: error: possible type mismatch of compared values of `!=` operation
44+
17 | println(Aaa{0} == AAaa{0})
45+
18 | println(AAaa{0} == Aaa{0})
46+
19 | println(AAaa{1} != Aaa{1})
4747
| ~~~~~~~~~~~~~~~~~
48-
18 | println(Aaa{1} != AAaa{1})
49-
19 |
50-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:18:10: error: possible type mismatch of compared values of `!=` operation
51-
16 | println(AAaa{0} == Aaa{0})
52-
17 | println(AAaa{1} != Aaa{1})
53-
18 | println(Aaa{1} != AAaa{1})
48+
20 | println(Aaa{1} != AAaa{1})
49+
21 |
50+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:20:10: error: possible type mismatch of compared values of `!=` operation
51+
18 | println(AAaa{0} == Aaa{0})
52+
19 | println(AAaa{1} != Aaa{1})
53+
20 | println(Aaa{1} != AAaa{1})
5454
| ~~~~~~~~~~~~~~~~~
55-
19 |
56-
20 | arr := Arr([0])
57-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:21:10: error: possible type mismatch of compared values of `==` operation
58-
19 |
59-
20 | arr := Arr([0])
60-
21 | println(arr == [0])
55+
21 |
56+
22 | arr := Arr([0])
57+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:23:10: error: possible type mismatch of compared values of `==` operation
58+
21 |
59+
22 | arr := Arr([0])
60+
23 | println(arr == [0])
6161
| ~~~~~~~~~~
62-
22 | println([1] == arr)
63-
23 | println(arr != [0])
64-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:22:10: error: possible type mismatch of compared values of `==` operation
65-
20 | arr := Arr([0])
66-
21 | println(arr == [0])
67-
22 | println([1] == arr)
62+
24 | println([1] == arr)
63+
25 | println(arr != [0])
64+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:24:10: error: possible type mismatch of compared values of `==` operation
65+
22 | arr := Arr([0])
66+
23 | println(arr == [0])
67+
24 | println([1] == arr)
6868
| ~~~~~~~~~~
69-
23 | println(arr != [0])
70-
24 | println([1] != arr)
71-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:23:10: error: possible type mismatch of compared values of `!=` operation
72-
21 | println(arr == [0])
73-
22 | println([1] == arr)
74-
23 | println(arr != [0])
69+
25 | println(arr != [0])
70+
26 | println([1] != arr)
71+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:25:10: error: possible type mismatch of compared values of `!=` operation
72+
23 | println(arr == [0])
73+
24 | println([1] == arr)
74+
25 | println(arr != [0])
7575
| ~~~~~~~~~~
76-
24 | println([1] != arr)
77-
25 | }
78-
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:24:10: error: possible type mismatch of compared values of `!=` operation
79-
22 | println([1] == arr)
80-
23 | println(arr != [0])
81-
24 | println([1] != arr)
76+
26 | println([1] != arr)
77+
27 |
78+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:26:10: error: possible type mismatch of compared values of `!=` operation
79+
24 | println([1] == arr)
80+
25 | println(arr != [0])
81+
26 | println([1] != arr)
8282
| ~~~~~~~~~~
83-
25 | }
84-
83+
27 |
84+
28 | arr_aaa := ArrAaa(arr)
85+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:29:10: error: possible type mismatch of compared values of `==` operation
86+
27 |
87+
28 | arr_aaa := ArrAaa(arr)
88+
29 | println(arr_aaa == arr)
89+
| ~~~~~~~~~~~~~~
90+
30 | println(arr == arr_aaa)
91+
31 | println(arr_aaa != arr)
92+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:30:10: error: possible type mismatch of compared values of `==` operation
93+
28 | arr_aaa := ArrAaa(arr)
94+
29 | println(arr_aaa == arr)
95+
30 | println(arr == arr_aaa)
96+
| ~~~~~~~~~~~~~~
97+
31 | println(arr_aaa != arr)
98+
32 | println(arr != arr_aaa)
99+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:31:10: error: possible type mismatch of compared values of `!=` operation
100+
29 | println(arr_aaa == arr)
101+
30 | println(arr == arr_aaa)
102+
31 | println(arr_aaa != arr)
103+
| ~~~~~~~~~~~~~~
104+
32 | println(arr != arr_aaa)
105+
33 |
106+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:32:10: error: possible type mismatch of compared values of `!=` operation
107+
30 | println(arr == arr_aaa)
108+
31 | println(arr_aaa != arr)
109+
32 | println(arr != arr_aaa)
110+
| ~~~~~~~~~~~~~~
111+
33 |
112+
34 | println(arr_aaa == [0])
113+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:34:10: error: infix expr: cannot use `[]int` (right expression) as `ArrAaa`
114+
32 | println(arr != arr_aaa)
115+
33 |
116+
34 | println(arr_aaa == [0])
117+
| ~~~~~~~~~~~~~~
118+
35 | println([1] == arr_aaa)
119+
36 | println(arr_aaa != [0])
120+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:35:10: error: infix expr: cannot use `ArrAaa` (right expression) as `[]int`
121+
33 |
122+
34 | println(arr_aaa == [0])
123+
35 | println([1] == arr_aaa)
124+
| ~~~~~~~~~~~~~~
125+
36 | println(arr_aaa != [0])
126+
37 | println([1] != arr_aaa)
127+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:36:10: error: infix expr: cannot use `[]int` (right expression) as `ArrAaa`
128+
34 | println(arr_aaa == [0])
129+
35 | println([1] == arr_aaa)
130+
36 | println(arr_aaa != [0])
131+
| ~~~~~~~~~~~~~~
132+
37 | println([1] != arr_aaa)
133+
38 | }
134+
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:37:10: error: infix expr: cannot use `ArrAaa` (right expression) as `[]int`
135+
35 | println([1] == arr_aaa)
136+
36 | println(arr_aaa != [0])
137+
37 | println([1] != arr_aaa)
138+
| ~~~~~~~~~~~~~~
139+
38 | }

vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ type AAaa = Aaa
66

77
type Arr = []int
88

9+
type ArrAaa = Aaa | Arr
10+
911
fn main() {
1012
println(Aaa{} == 10)
1113
println(10 == Aaa{})
@@ -22,4 +24,15 @@ fn main() {
2224
println([1] == arr)
2325
println(arr != [0])
2426
println([1] != arr)
27+
28+
arr_aaa := ArrAaa(arr)
29+
println(arr_aaa == arr)
30+
println(arr == arr_aaa)
31+
println(arr_aaa != arr)
32+
println(arr != arr_aaa)
33+
34+
println(arr_aaa == [0])
35+
println([1] == arr_aaa)
36+
println(arr_aaa != [0])
37+
println([1] != arr_aaa)
2538
}

vlib/v/gen/c/auto_eq_methods.v

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,59 @@ module c
55
import strings
66
import v.table
77

8+
fn (mut g Gen) gen_sumtype_equality_fn(left table.Type) string {
9+
ptr_typ := g.typ(left).trim('*')
10+
if ptr_typ in g.sumtype_fn_definitions {
11+
return ptr_typ
12+
}
13+
g.sumtype_fn_definitions << ptr_typ
14+
left_sym := g.table.get_type_symbol(left)
15+
info := left_sym.sumtype_info()
16+
g.type_definitions.writeln('static bool ${ptr_typ}_sumtype_eq($ptr_typ a, $ptr_typ b); // auto')
17+
mut fn_builder := strings.new_builder(512)
18+
fn_builder.writeln('static bool ${ptr_typ}_sumtype_eq($ptr_typ a, $ptr_typ b) {')
19+
20+
fn_builder.writeln('\tif (a._typ != b._typ) { return false; } ')
21+
for typ in info.variants {
22+
sym := g.table.get_type_symbol(typ)
23+
fn_builder.writeln('\tif (a._typ == $typ) {')
24+
name := '_$sym.cname'
25+
if sym.kind == .string {
26+
fn_builder.writeln('\t\tif (string_ne(*a.$name, *b.$name)) {')
27+
} else if sym.kind == .sum_type && !typ.is_ptr() {
28+
eq_fn := g.gen_sumtype_equality_fn(typ)
29+
fn_builder.writeln('\t\tif (!${eq_fn}_sumtype_eq(*a.$name, *b.$name)) {')
30+
} else if sym.kind == .struct_ && !typ.is_ptr() {
31+
eq_fn := g.gen_struct_equality_fn(typ)
32+
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*a.$name, *b.$name)) {')
33+
} else if sym.kind == .array && !typ.is_ptr() {
34+
eq_fn := g.gen_array_equality_fn(typ)
35+
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*a.$name, *b.$name)) {')
36+
} else if sym.kind == .array_fixed && !typ.is_ptr() {
37+
eq_fn := g.gen_fixed_array_equality_fn(typ)
38+
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*a.$name, *b.$name)) {')
39+
} else if sym.kind == .map && !typ.is_ptr() {
40+
eq_fn := g.gen_map_equality_fn(typ)
41+
fn_builder.writeln('\t\tif (!${eq_fn}_map_eq(*a.$name, *b.$name)) {')
42+
} else if sym.kind == .alias && !typ.is_ptr() {
43+
eq_fn := g.gen_alias_equality_fn(typ)
44+
fn_builder.writeln('\t\tif (!${eq_fn}_alias_eq(*a.$name, *b.$name)) {')
45+
} else if sym.kind == .function {
46+
fn_builder.writeln('\t\tif (*((voidptr*)(*a.$name)) != *((voidptr*)(*b.$name))) {')
47+
} else {
48+
fn_builder.writeln('\t\tif (*a.$name != *b.$name) {')
49+
}
50+
fn_builder.writeln('\t\t\treturn false;')
51+
fn_builder.writeln('\t\t}')
52+
fn_builder.writeln('\t\treturn true;')
53+
fn_builder.writeln('\t}')
54+
}
55+
fn_builder.writeln('\treturn false;')
56+
fn_builder.writeln('}')
57+
g.auto_fn_definitions << fn_builder.str()
58+
return ptr_typ
59+
}
60+
861
fn (mut g Gen) gen_struct_equality_fn(left table.Type) string {
962
ptr_typ := g.typ(left).trim('*')
1063
if ptr_typ in g.struct_fn_definitions {
@@ -20,6 +73,9 @@ fn (mut g Gen) gen_struct_equality_fn(left table.Type) string {
2073
sym := g.table.get_type_symbol(field.typ)
2174
if sym.kind == .string {
2275
fn_builder.writeln('\tif (string_ne(a.$field.name, b.$field.name)) {')
76+
} else if sym.kind == .sum_type && !field.typ.is_ptr() {
77+
eq_fn := g.gen_sumtype_equality_fn(field.typ)
78+
fn_builder.writeln('\tif (!${eq_fn}_sumtype_eq(a.$field.name, b.$field.name)) {')
2379
} else if sym.kind == .struct_ && !field.typ.is_ptr() {
2480
eq_fn := g.gen_struct_equality_fn(field.typ)
2581
fn_builder.writeln('\tif (!${eq_fn}_struct_eq(a.$field.name, b.$field.name)) {')
@@ -63,6 +119,9 @@ fn (mut g Gen) gen_alias_equality_fn(left table.Type) string {
63119
sym := g.table.get_type_symbol(info.parent_type)
64120
if sym.kind == .string {
65121
fn_builder.writeln('\tif (string_ne(a, b)) {')
122+
} else if sym.kind == .sum_type && !left.is_ptr() {
123+
eq_fn := g.gen_sumtype_equality_fn(info.parent_type)
124+
fn_builder.writeln('\tif (!${eq_fn}_sumtype_eq(a, b)) {')
66125
} else if sym.kind == .struct_ && !left.is_ptr() {
67126
eq_fn := g.gen_struct_equality_fn(info.parent_type)
68127
fn_builder.writeln('\tif (!${eq_fn}_struct_eq(a, b)) {')
@@ -108,6 +167,9 @@ fn (mut g Gen) gen_array_equality_fn(left table.Type) string {
108167
// compare every pair of elements of the two arrays
109168
if elem_sym.kind == .string {
110169
fn_builder.writeln('\t\tif (string_ne(*(($ptr_elem_typ*)((byte*)a.data+(i*a.element_size))), *(($ptr_elem_typ*)((byte*)b.data+(i*b.element_size))))) {')
170+
} else if elem_sym.kind == .sum_type && !elem_typ.is_ptr() {
171+
eq_fn := g.gen_sumtype_equality_fn(elem_typ)
172+
fn_builder.writeln('\t\tif (!${eq_fn}_sumtype_eq((($ptr_elem_typ*)a.data)[i], (($ptr_elem_typ*)b.data)[i])) {')
111173
} else if elem_sym.kind == .struct_ && !elem_typ.is_ptr() {
112174
eq_fn := g.gen_struct_equality_fn(elem_typ)
113175
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq((($ptr_elem_typ*)a.data)[i], (($ptr_elem_typ*)b.data)[i])) {')
@@ -155,6 +217,9 @@ fn (mut g Gen) gen_fixed_array_equality_fn(left table.Type) string {
155217
// compare every pair of elements of the two fixed arrays
156218
if elem_sym.kind == .string {
157219
fn_builder.writeln('\t\tif (string_ne(a[i], b[i])) {')
220+
} else if elem_sym.kind == .sum_type && !elem_typ.is_ptr() {
221+
eq_fn := g.gen_sumtype_equality_fn(elem_typ)
222+
fn_builder.writeln('\t\tif (!${eq_fn}_sumtype_eq(a[i], b[i])) {')
158223
} else if elem_sym.kind == .struct_ && !elem_typ.is_ptr() {
159224
eq_fn := g.gen_struct_equality_fn(elem_typ)
160225
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(a[i], b[i])) {')
@@ -225,6 +290,10 @@ fn (mut g Gen) gen_map_equality_fn(left table.Type) string {
225290
.string {
226291
fn_builder.writeln('\t\tif (!fast_string_eq(*(string*)map_get_1(&b, k, &(string[]){_SLIT("")}), v)) {')
227292
}
293+
.sum_type {
294+
eq_fn := g.gen_sumtype_equality_fn(value_typ)
295+
fn_builder.writeln('\t\tif (!${eq_fn}_sumtype_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
296+
}
228297
.struct_ {
229298
eq_fn := g.gen_struct_equality_fn(value_typ)
230299
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
@@ -249,6 +318,7 @@ fn (mut g Gen) gen_map_equality_fn(left table.Type) string {
249318
fn_builder.writeln('\t\tif (*(voidptr*)map_get_1(&b, k, &(voidptr[]){ 0 }) != v) {')
250319
}
251320
else {
321+
println(kind)
252322
fn_builder.writeln('\t\tif (*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }) != v) {')
253323
}
254324
}

0 commit comments

Comments
 (0)