Skip to content

Commit

Permalink
checker: improve if expr with compound conditions (#22541)
Browse files Browse the repository at this point in the history
  • Loading branch information
yuyi98 authored Oct 16, 2024
1 parent ffa7921 commit a2e478b
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 2 deletions.
13 changes: 13 additions & 0 deletions vlib/v/checker/infix.v
Original file line number Diff line number Diff line change
Expand Up @@ -1054,6 +1054,19 @@ fn (mut c Checker) autocast_in_if_conds(mut right ast.Expr, from_expr ast.Expr,
}
ast.IndexExpr {
c.autocast_in_if_conds(mut right.left, from_expr, from_type, to_type)
c.autocast_in_if_conds(mut right.index, from_expr, from_type, to_type)
}
ast.RangeExpr {
c.autocast_in_if_conds(mut right.low, from_expr, from_type, to_type)
c.autocast_in_if_conds(mut right.high, from_expr, from_type, to_type)
}
ast.StringInterLiteral {
for mut expr in right.exprs {
c.autocast_in_if_conds(mut expr, from_expr, from_type, to_type)
}
}
ast.UnsafeExpr {
c.autocast_in_if_conds(mut right.expr, from_expr, from_type, to_type)
}
else {}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
type Foo = int | []int

fn test_if_expr_with_compound_conds() {
fn works() bool {
a := Foo([3])
if a is []int && a[0] == 3 {
println('works')
return true
}
assert true
return false
}

fn test_if_expr_with_compound_conds() {
assert works()
}
15 changes: 15 additions & 0 deletions vlib/v/tests/conditions/ifs/if_expr_with_compound_conds_2_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
type Foo = int | []int

fn works() bool {
arr := [1, 2, 3]
a := Foo(2)
if a is int && arr[a] == 3 {
println('works')
return true
}
return false
}

fn test_if_expr_with_compound_conds() {
assert works()
}
14 changes: 14 additions & 0 deletions vlib/v/tests/conditions/ifs/if_expr_with_compound_conds_3_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
type Foo = int | []int

fn works() bool {
a := Foo(2)
if a is int && '${a}' == '2' {
println('works')
return true
}
return false
}

fn test_if_expr_with_compound_conds() {
assert works()
}
15 changes: 15 additions & 0 deletions vlib/v/tests/conditions/ifs/if_expr_with_compound_conds_4_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
type Foo = int | []int

fn works() bool {
arr := [1, 2, 3]
a := Foo(2)
if a is int && unsafe { arr[..a] == [1, 2] } {
println('works')
return true
}
return false
}

fn test_if_expr_with_compound_conds() {
assert works()
}

0 comments on commit a2e478b

Please sign in to comment.