From d0d5f1d4e078fa63f53413d8d1a3bb428862f653 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 4 Sep 2022 22:50:41 +0800 Subject: [PATCH] cgen: fix fn variable name using reserved c word (fix #15647) (#15648) --- vlib/v/gen/c/assign.v | 3 ++- vlib/v/gen/c/utils.v | 2 +- vlib/v/tests/fn_var_name_using_reserved_test.v | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/fn_var_name_using_reserved_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 450c236f0..8854ff62e 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -339,7 +339,8 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { '' } - g.write('$ret_styp ($msvc_call_conv*${g.get_ternary_name(ident.name)}) (') + fn_name := c_name(g.get_ternary_name(ident.name)) + g.write('$ret_styp ($msvc_call_conv*$fn_name) (') def_pos := g.definitions.len g.fn_decl_params(func.func.params, unsafe { nil }, false) g.definitions.go_back(g.definitions.len - def_pos) diff --git a/vlib/v/gen/c/utils.v b/vlib/v/gen/c/utils.v index 07a9ca520..e61bb6214 100644 --- a/vlib/v/gen/c/utils.v +++ b/vlib/v/gen/c/utils.v @@ -65,7 +65,7 @@ fn (mut g Gen) unwrap(typ ast.Type) Type { // generate function variable definition, e.g. `void (*var_name) (int, string)` fn (mut g Gen) fn_var_signature(return_type ast.Type, arg_types []ast.Type, var_name string) string { ret_styp := g.typ(return_type) - mut sig := '$ret_styp (*$var_name) (' + mut sig := '$ret_styp (*${c_name(var_name)}) (' for j, arg_typ in arg_types { arg_sym := g.table.sym(arg_typ) if arg_sym.info is ast.FnType { diff --git a/vlib/v/tests/fn_var_name_using_reserved_test.v b/vlib/v/tests/fn_var_name_using_reserved_test.v new file mode 100644 index 000000000..a66682873 --- /dev/null +++ b/vlib/v/tests/fn_var_name_using_reserved_test.v @@ -0,0 +1,11 @@ +fn ret_int() fn (int) int { + return fn (i int) int { + return i + } +} + +fn test_fn_var_name_using_reserved() { + new := ret_int() + println(new(42)) + assert new(42) == 42 +} -- 2.30.2