Skip to content

Commit dff39ba

Browse files
authored
cgen: fix error for defining global anonymous functions (#13808)
1 parent e3dca82 commit dff39ba

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

vlib/v/gen/c/cgen.v

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4360,6 +4360,13 @@ fn (mut g Gen) global_decl(node ast.GlobalDecl) {
43604360
}
43614361
}
43624362
styp := g.typ(field.typ)
4363+
mut anon_fn_expr := unsafe { field.expr }
4364+
if field.has_expr && mut anon_fn_expr is ast.AnonFn {
4365+
g.gen_anon_fn_decl(mut anon_fn_expr)
4366+
fn_type_name := g.get_anon_fn_type_name(mut anon_fn_expr, field.name)
4367+
g.definitions.writeln('$fn_type_name = ${g.table.sym(field.typ).name}; // global')
4368+
continue
4369+
}
43634370
g.definitions.write_string('$visibility_kw$styp $attributes $field.name')
43644371
if field.has_expr {
43654372
if field.expr.is_literal() && should_init {

vlib/v/gen/c/fn.v

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,25 @@ fn (mut g Gen) fn_decl_params(params []ast.Param, scope &ast.Scope, is_variadic
612612
return fargs, fargtypes, heap_promoted
613613
}
614614

615+
fn (mut g Gen) get_anon_fn_type_name(mut node ast.AnonFn, var_name string) string {
616+
mut builder := strings.new_builder(64)
617+
return_styp := g.typ(node.decl.return_type)
618+
builder.write_string('$return_styp (*$var_name) (')
619+
if node.decl.params.len == 0 {
620+
builder.write_string('void)')
621+
} else {
622+
for i, param in node.decl.params {
623+
param_styp := g.typ(param.typ)
624+
builder.write_string('$param_styp $param.name')
625+
if i != node.decl.params.len - 1 {
626+
builder.write_string(', ')
627+
}
628+
}
629+
builder.write_string(')')
630+
}
631+
return builder.str()
632+
}
633+
615634
fn (mut g Gen) call_expr(node ast.CallExpr) {
616635
// g.write('/*call expr*/')
617636
// NOTE: everything could be done this way

vlib/v/tests/init_global_test.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ fn test_no_type() {
5353
assert testmap['asd'] == -7.25
5454
}
5555

56+
fn test_fn_type() {
57+
assert func2(22) == 22
58+
assert func3(22) == '22'
59+
}
60+
5661
__global (
5762
intmap map[string]int
5863
numberfns map[string]fn () int
@@ -75,6 +80,13 @@ __global (
7580
'asd': -7.25
7681
'yxc': 3.125
7782
}
83+
func1 = fn () {}
84+
func2 = fn (n int) int {
85+
return n
86+
}
87+
func3 = fn (n int) string {
88+
return '$n'
89+
}
7890
)
7991

8092
fn init() {

0 commit comments

Comments
 (0)