From fde0d9fa91cfaffd656ae69bd626aa854d8b9501 Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 27 Jul 2023 17:36:44 +0800 Subject: [PATCH] checker: fix compiling 'f(g()!)' with -autofree (#18979) --- vlib/v/checker/fn.v | 7 +++++-- vlib/v/slow_tests/valgrind/fn_call_result_arg.v | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 vlib/v/slow_tests/valgrind/fn_call_result_arg.v diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 70b36976bdbb54..874559339e9934 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -507,8 +507,11 @@ fn (mut c Checker) call_expr(mut node ast.CallExpr) ast.Type { c.inside_fn_arg = old_inside_fn_arg // autofree: mark args that have to be freed (after saving them in tmp exprs) free_tmp_arg_vars := c.pref.autofree && !c.is_builtin_mod && node.args.len > 0 - && !node.args[0].typ.has_flag(.option) && !node.args[0].typ.has_flag(.result) - if free_tmp_arg_vars && !c.inside_const { + && !c.inside_const && !node.args[0].typ.has_flag(.option) + && !node.args[0].typ.has_flag(.result) && !(node.args[0].expr is ast.CallExpr + && (node.args[0].expr.return_type.has_flag(.option) + || node.args[0].expr.return_type.has_flag(.result))) + if free_tmp_arg_vars { for i, arg in node.args { if arg.typ != ast.string_type { continue diff --git a/vlib/v/slow_tests/valgrind/fn_call_result_arg.v b/vlib/v/slow_tests/valgrind/fn_call_result_arg.v new file mode 100644 index 00000000000000..971a8ae58a496c --- /dev/null +++ b/vlib/v/slow_tests/valgrind/fn_call_result_arg.v @@ -0,0 +1,11 @@ +fn f() !string { + return 'abc' +} + +fn g(s string) { + println(s) +} + +fn main() { + g(f()!) +}