Skip to content

Commit 555bad7

Browse files
authored
cgen: improve fixed array literal in operation and index calls (#22590)
1 parent ddbef2d commit 555bad7

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

vlib/v/gen/c/array.v

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,7 +1003,7 @@ fn (mut g Gen) gen_array_contains_methods() {
10031003
fn_builder.writeln('\tfor (int i = 0; i < ${size}; ++i) {')
10041004
if elem_kind == .string {
10051005
fn_builder.writeln('\t\tif (fast_string_eq(a[i], v)) {')
1006-
} else if elem_kind == .array && elem_is_not_ptr {
1006+
} else if elem_kind in [.array, .array_fixed] && elem_is_not_ptr {
10071007
ptr_typ := g.equality_fn(left_info.elem_type)
10081008
fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq(a[i], v)) {')
10091009
} else if elem_kind == .function {
@@ -1110,7 +1110,7 @@ fn (mut g Gen) gen_array_index_methods() {
11101110
fn_builder.writeln('\tfor (int i = 0; i < a.len; ++i, ++pelem) {')
11111111
if elem_sym.kind == .string {
11121112
fn_builder.writeln('\t\tif (fast_string_eq(*pelem, v)) {')
1113-
} else if elem_sym.kind == .array && !info.elem_type.is_ptr() {
1113+
} else if elem_sym.kind in [.array, .array_fixed] && !info.elem_type.is_ptr() {
11141114
ptr_typ := g.equality_fn(info.elem_type)
11151115
fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq(*pelem, v)) {')
11161116
} else if elem_sym.kind == .function && !info.elem_type.is_ptr() {
@@ -1168,6 +1168,17 @@ fn (mut g Gen) gen_array_index(node ast.CallExpr) {
11681168
}
11691169
if g.table.sym(elem_typ).kind in [.interface, .sum_type] {
11701170
g.expr_with_cast(node.args[0].expr, node.args[0].typ, elem_typ)
1171+
} else if node.args[0].expr is ast.ArrayInit {
1172+
if g.is_cc_msvc {
1173+
stmts := g.go_before_last_stmt().trim_space()
1174+
tmp_var := g.new_tmp_var()
1175+
g.write('${g.typ(node.args[0].typ)} ${tmp_var} = ${g.expr_string(node.args[0].expr)};')
1176+
g.write(stmts)
1177+
g.write(tmp_var)
1178+
} else {
1179+
g.write('(${g.typ(node.args[0].typ)})')
1180+
g.expr(node.args[0].expr)
1181+
}
11711182
} else {
11721183
g.expr(node.args[0].expr)
11731184
}
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
1-
fn test_main() {
1+
fn test_array_of_fixed_array_in_op() {
22
mut a := [][2]int{}
3-
a << [0, 0]!
4-
println([0, 0]! in a)
5-
ret := [0, 0]! in a
3+
a << [1, 2]!
4+
println([1, 2]! in a)
5+
ret := [1, 2]! in a
66
println(ret)
77
assert ret
88
}
9+
10+
fn test_fixed_array_of_fixed_array_in_op() {
11+
mut a := [2][2]int{}
12+
a[0] = [1, 2]!
13+
println([1, 2]! in a)
14+
ret := [1, 2]! in a
15+
println(ret)
16+
assert ret
17+
}
18+
19+
fn test_array_of_fixed_array_index() {
20+
mut a := [][2]int{}
21+
a << [1, 2]!
22+
println(a.index([1, 2]!))
23+
ret := a.index([1, 2]!)
24+
println(ret)
25+
assert ret == 0
26+
}

0 commit comments

Comments
 (0)