From 02860a0f86ae13fd9249a439b609f0abdaff7f7d Mon Sep 17 00:00:00 2001 From: GGRei Date: Sun, 4 Feb 2024 20:02:09 +0100 Subject: [PATCH 1/2] cgen: Fix premature variable release by autofree --- vlib/v/gen/c/cgen.v | 4 +++- .../valgrind/if_expr_autofree_optional.v | 19 +++++++++++++++++++ vlib/v/slow_tests/valgrind/valgrind_test.v | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 4aec3a14d48689..ed917c85a3e4e1 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2970,7 +2970,9 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int // continue // } // if v.pos.pos > end_pos { - if obj.pos.pos > end_pos || (obj.pos.pos < start_pos && obj.pos.line_nr == line_nr) { + if obj.pos.pos > end_pos + || (obj.pos.pos < start_pos && obj.pos.line_nr == line_nr) + || (end_pos < scope.end_pos && obj.expr is ast.IfExpr) { // Do not free vars that were declared after this scope continue } diff --git a/vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v b/vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v new file mode 100644 index 00000000000000..4cccbe588cbe62 --- /dev/null +++ b/vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v @@ -0,0 +1,19 @@ +fn main() { + out := if temp := f('') { + temp + } else if temp := f('something') { + temp + } else { + return + } + + assert out[0] == 104 + assert out[1] == 105 +} + +fn f(s string) ?[]u8 { + if s == '' { + return none + } + return [u8(104), 105] +} diff --git a/vlib/v/slow_tests/valgrind/valgrind_test.v b/vlib/v/slow_tests/valgrind/valgrind_test.v index e9339fb690a5e8..9d7a3062f20a0c 100644 --- a/vlib/v/slow_tests/valgrind/valgrind_test.v +++ b/vlib/v/slow_tests/valgrind/valgrind_test.v @@ -21,6 +21,7 @@ fn bold(s string) string { // const skip_compile_files = [ 'vlib/v/slow_tests/valgrind/option_reassigned.v', + 'vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v', ] const skip_valgrind_files = [ From fbc2fa30764149a6a01da6a9c101cde736760c66 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Mon, 5 Feb 2024 17:08:55 +0200 Subject: [PATCH 2/2] remove if_expr_autofree_optional.v from skip_compile_files --- vlib/v/slow_tests/valgrind/valgrind_test.v | 1 - 1 file changed, 1 deletion(-) diff --git a/vlib/v/slow_tests/valgrind/valgrind_test.v b/vlib/v/slow_tests/valgrind/valgrind_test.v index 9d7a3062f20a0c..e9339fb690a5e8 100644 --- a/vlib/v/slow_tests/valgrind/valgrind_test.v +++ b/vlib/v/slow_tests/valgrind/valgrind_test.v @@ -21,7 +21,6 @@ fn bold(s string) string { // const skip_compile_files = [ 'vlib/v/slow_tests/valgrind/option_reassigned.v', - 'vlib/v/slow_tests/valgrind/if_expr_autofree_optional.v', ] const skip_valgrind_files = [