Skip to content

Commit fe017af

Browse files
authored
cgen: fix code generation when 'in array init' is used as an if condition (fix #20300) (#20302)
1 parent 0df6fcc commit fe017af

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

vlib/v/gen/c/infix.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,9 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
518518
expr: node.left
519519
expr_type: ast.mktyp(node.left_type)
520520
}
521+
g.write('(')
521522
g.gen_array_contains(node.right_type, node.right, elem_type, new_node_left)
523+
g.write(')')
522524
return
523525
}
524526
} else if elem_type_.sym.kind == .interface_ {
@@ -528,11 +530,15 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
528530
expr: node.left
529531
expr_type: ast.mktyp(node.left_type)
530532
}
533+
g.write('(')
531534
g.gen_array_contains(node.right_type, node.right, elem_type, new_node_left)
535+
g.write(')')
532536
return
533537
}
534538
}
539+
g.write('(')
535540
g.gen_array_contains(node.right_type, node.right, node.left_type, node.left)
541+
g.write(')')
536542
} else if right.unaliased_sym.kind == .map {
537543
g.write('_IN_MAP(')
538544
if !left.typ.is_ptr() {
@@ -597,18 +603,24 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
597603
expr: node.left
598604
expr_type: ast.mktyp(node.left_type)
599605
}
606+
g.write('(')
600607
g.gen_array_contains(node.right_type, node.right, elem_type, new_node_left)
608+
g.write(')')
601609
return
602610
}
603611
}
604612
}
613+
g.write('(')
605614
g.gen_array_contains(node.right_type, node.right, node.left_type, node.left)
615+
g.write(')')
606616
} else if right.unaliased_sym.kind == .string {
617+
g.write('(')
607618
g.write('string_contains(')
608619
g.expr(node.right)
609620
g.write(', ')
610621
g.expr(node.left)
611622
g.write(')')
623+
g.write(')')
612624
}
613625
}
614626

vlib/v/tests/if_expression_test.v

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,13 @@ fn test_noreturn() {
263263
assert_false_noreturn()
264264
}
265265
}
266+
267+
// for issue 20300
268+
// Phenomenon of issue:
269+
// infix expr generates wraparound parentheses, but misses the case where `array_contains()` is used.
270+
fn test_in_array_init() {
271+
if 0 in []int{} {
272+
assert false
273+
}
274+
assert true
275+
}

0 commit comments

Comments
 (0)