From cd152169e8792d07ce8ef5403f397f2dc4721610 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 21 Sep 2025 02:42:35 -0300 Subject: [PATCH] markused: fix or block handling and result propagation from indexexpr (fix #25339) (#25356) --- vlib/v/markused/walker.v | 11 ++++++----- vlib/v/tests/skip_unused/ident_or_block.run.out | 1 + .../skip_unused/ident_or_block.skip_unused.run.out | 1 + vlib/v/tests/skip_unused/ident_or_block.vv | 12 ++++++++++++ .../skip_unused/indexexpr_result_propagation.run.out | 1 + .../indexexpr_result_propagation.skip_unused.run.out | 1 + .../skip_unused/indexexpr_result_propagation.vv | 12 ++++++++++++ 7 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 vlib/v/tests/skip_unused/ident_or_block.run.out create mode 100644 vlib/v/tests/skip_unused/ident_or_block.skip_unused.run.out create mode 100644 vlib/v/tests/skip_unused/ident_or_block.vv create mode 100644 vlib/v/tests/skip_unused/indexexpr_result_propagation.run.out create mode 100644 vlib/v/tests/skip_unused/indexexpr_result_propagation.skip_unused.run.out create mode 100644 vlib/v/tests/skip_unused/indexexpr_result_propagation.vv diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index ce63ea569..6b7bfc48f 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -53,7 +53,7 @@ mut: uses_ct_variants bool // $for .variants uses_ct_attribute bool // $for .attributes uses_external_type bool - uses_err bool // err var + uses_err_block bool // or { err var } uses_asserts bool // assert uses_map_update bool // has {...expr} uses_debugger bool // has debugger; @@ -547,7 +547,7 @@ fn (mut w Walker) expr(node_ ast.Expr) { ast.IndexExpr { w.expr(node.left) w.expr(node.index) - if node.or_expr.kind == .block { + if node.or_expr.kind != .absent { w.uses_index_check = true } w.mark_by_type(node.typ) @@ -709,9 +709,6 @@ fn (mut w Walker) expr(node_ ast.Expr) { } else if node.name in w.all_globals { w.mark_global_as_used(node.name) } else { - if !w.uses_err && node.name == 'err' { - w.uses_err = true - } w.fn_by_name(node.name) } if !w.uses_atomic && node.info is ast.IdentVar { @@ -1105,6 +1102,7 @@ pub fn (mut w Walker) const_fields(cfields []ast.ConstField) { @[inline] pub fn (mut w Walker) or_block(node ast.OrExpr) { if node.kind == .block { + w.uses_err_block = true w.stmts(node.stmts) } else if node.kind == .propagate_option { w.used_option++ @@ -1470,6 +1468,9 @@ fn (mut w Walker) mark_resource_dependencies() { continue } } + if w.uses_err_block { + w.fn_by_name('error') + } if w.uses_guard || w.uses_index_check { w.fn_by_name('error') w.fn_by_name(array_idx_str + '.get_with_check') diff --git a/vlib/v/tests/skip_unused/ident_or_block.run.out b/vlib/v/tests/skip_unused/ident_or_block.run.out new file mode 100644 index 000000000..e30f1a968 --- /dev/null +++ b/vlib/v/tests/skip_unused/ident_or_block.run.out @@ -0,0 +1 @@ +[vlib/v/tests/skip_unused/ident_or_block.vv:12] set.len: 0 diff --git a/vlib/v/tests/skip_unused/ident_or_block.skip_unused.run.out b/vlib/v/tests/skip_unused/ident_or_block.skip_unused.run.out new file mode 100644 index 000000000..e30f1a968 --- /dev/null +++ b/vlib/v/tests/skip_unused/ident_or_block.skip_unused.run.out @@ -0,0 +1 @@ +[vlib/v/tests/skip_unused/ident_or_block.vv:12] set.len: 0 diff --git a/vlib/v/tests/skip_unused/ident_or_block.vv b/vlib/v/tests/skip_unused/ident_or_block.vv new file mode 100644 index 000000000..33c83be70 --- /dev/null +++ b/vlib/v/tests/skip_unused/ident_or_block.vv @@ -0,0 +1,12 @@ +pub struct Row { +pub mut: + vals []?string +} + +mut set := map[string]bool{} +rows := []Row{} +for row in rows { + val := row.vals[0] + set[val or { 'invariant' }] = true +} +dump(set.len) diff --git a/vlib/v/tests/skip_unused/indexexpr_result_propagation.run.out b/vlib/v/tests/skip_unused/indexexpr_result_propagation.run.out new file mode 100644 index 000000000..0dc461651 --- /dev/null +++ b/vlib/v/tests/skip_unused/indexexpr_result_propagation.run.out @@ -0,0 +1 @@ +[vlib/v/tests/skip_unused/indexexpr_result_propagation.vv:12] set.len: 0 diff --git a/vlib/v/tests/skip_unused/indexexpr_result_propagation.skip_unused.run.out b/vlib/v/tests/skip_unused/indexexpr_result_propagation.skip_unused.run.out new file mode 100644 index 000000000..0dc461651 --- /dev/null +++ b/vlib/v/tests/skip_unused/indexexpr_result_propagation.skip_unused.run.out @@ -0,0 +1 @@ +[vlib/v/tests/skip_unused/indexexpr_result_propagation.vv:12] set.len: 0 diff --git a/vlib/v/tests/skip_unused/indexexpr_result_propagation.vv b/vlib/v/tests/skip_unused/indexexpr_result_propagation.vv new file mode 100644 index 000000000..3114e1fdf --- /dev/null +++ b/vlib/v/tests/skip_unused/indexexpr_result_propagation.vv @@ -0,0 +1,12 @@ +pub struct Row { +pub mut: + vals []?string +} + +mut set := map[string]bool{} +rows := []Row{} +for row in rows { + val := row.vals[0]! + set[val] = true +} +dump(set.len) -- 2.39.5