From 2dd65872dc9f38443b1f139c5cca04e68797fac6 Mon Sep 17 00:00:00 2001 From: Hector Peeters Date: Tue, 5 Nov 2024 11:35:22 +0100 Subject: [PATCH] v: fix redundant emission of left expression in in infix expressions (#22763) --- vlib/v/gen/c/infix.v | 3 ++- vlib/v/gen/c/testdata/for_in_side_effect.out | 1 + vlib/v/gen/c/testdata/for_in_side_effect.vv | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/testdata/for_in_side_effect.out create mode 100644 vlib/v/gen/c/testdata/for_in_side_effect.vv diff --git a/vlib/v/gen/c/infix.v b/vlib/v/gen/c/infix.v index 13334cc67..5160d7584 100644 --- a/vlib/v/gen/c/infix.v +++ b/vlib/v/gen/c/infix.v @@ -517,7 +517,8 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) { if node.right is ast.ArrayInit { elem_type := node.right.elem_type elem_sym := g.table.sym(elem_type) - if node.right.exprs.len > 0 { + // TODO: replace ast.Ident check with proper side effect analysis + if node.right.exprs.len > 0 && node.left is ast.Ident { // `a in [1,2,3]` optimization => `a == 1 || a == 2 || a == 3` // avoids an allocation g.write('(') diff --git a/vlib/v/gen/c/testdata/for_in_side_effect.out b/vlib/v/gen/c/testdata/for_in_side_effect.out new file mode 100644 index 000000000..e2d8a3257 --- /dev/null +++ b/vlib/v/gen/c/testdata/for_in_side_effect.out @@ -0,0 +1 @@ +side effect diff --git a/vlib/v/gen/c/testdata/for_in_side_effect.vv b/vlib/v/gen/c/testdata/for_in_side_effect.vv new file mode 100644 index 000000000..40eb22370 --- /dev/null +++ b/vlib/v/gen/c/testdata/for_in_side_effect.vv @@ -0,0 +1,8 @@ +fn test() bool { + println('side effect') + return true +} + +fn main() { + assert (test() in [false, true]) == true +} -- 2.39.5