Skip to content

Commit 4e1a09c

Browse files
authored
cgen: fix array_init temporary variable error
1 parent 90279a7 commit 4e1a09c

File tree

2 files changed

+23
-32
lines changed

2 files changed

+23
-32
lines changed

vlib/v/gen/cgen.v

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,7 +1097,6 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
10971097
if is_call {
10981098
g.expr(val)
10991099
} else {
1100-
g.gen_default_init_value(val)
11011100
g.write('{$styp _ = ')
11021101
g.expr(val)
11031102
g.writeln(';}')
@@ -1106,7 +1105,13 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
11061105
right_sym := g.table.get_type_symbol(assign_stmt.right_types[i])
11071106
mut is_fixed_array_init := false
11081107
mut has_val := false
1109-
is_fixed_array_init, has_val = g.gen_default_init_value(val)
1108+
match val {
1109+
ast.ArrayInit {
1110+
is_fixed_array_init = it.is_fixed
1111+
has_val = it.has_val
1112+
}
1113+
else {}
1114+
}
11101115
is_inside_ternary := g.inside_ternary != 0
11111116
cur_line := if is_inside_ternary {
11121117
g.register_ternary_name(ident.name)
@@ -1209,33 +1214,6 @@ fn (mut g Gen) gen_cross_tmp_variable(idents []ast.Ident, val ast.Expr) {
12091214
}
12101215
}
12111216

1212-
fn (mut g Gen) gen_default_init_value(val ast.Expr) (bool, bool) {
1213-
mut is_fixed_array_init := false
1214-
mut has_val := false
1215-
match val {
1216-
ast.ArrayInit {
1217-
is_fixed_array_init = it.is_fixed
1218-
has_val = it.has_val
1219-
elem_type_str := g.typ(it.elem_type)
1220-
if it.has_default {
1221-
g.gen_default_init_value(it.default_expr)
1222-
g.write('$elem_type_str _val_$it.pos.pos = ')
1223-
g.expr(it.default_expr)
1224-
g.writeln(';')
1225-
} else if it.has_len && it.elem_type == table.string_type {
1226-
g.writeln('$elem_type_str _val_$it.pos.pos = tos_lit("");')
1227-
}
1228-
}
1229-
ast.StructInit {
1230-
for field in it.fields {
1231-
g.gen_default_init_value(field.expr)
1232-
}
1233-
}
1234-
else {}
1235-
}
1236-
return is_fixed_array_init, has_val
1237-
}
1238-
12391217
fn (mut g Gen) register_ternary_name(name string) {
12401218
level_key := g.inside_ternary.str()
12411219
if level_key !in g.ternary_level_names {
@@ -4348,9 +4326,17 @@ fn (mut g Gen) array_init(it ast.ArrayInit) {
43484326
}
43494327
g.write('sizeof($elem_type_str), ')
43504328
if is_default_array {
4351-
g.write('_val_$it.pos.pos)')
4352-
} else if it.has_default || (it.has_len && it.elem_type == table.string_type) {
4353-
g.write('&_val_$it.pos.pos)')
4329+
g.write('($elem_type_str[]){')
4330+
g.expr(it.default_expr)
4331+
g.write('}[0])')
4332+
} else if it.has_default {
4333+
g.write('&($elem_type_str[]){')
4334+
g.expr(it.default_expr)
4335+
g.write('})')
4336+
} else if it.has_len && it.elem_type == table.string_type {
4337+
g.write('&($elem_type_str[]){')
4338+
g.write('tos_lit("")')
4339+
g.write('})')
43544340
} else {
43554341
g.write('0)')
43564342
}

vlib/v/tests/array_init_test.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,8 @@ fn test_multi_dimensional_array_init() {
189189
f := [][]int{len:3}
190190
assert '$f' == '[[], [], []]'
191191
}
192+
193+
fn test_array_init_direct_call() {
194+
assert []int{len: 2, init: 0}.len == 2
195+
assert []int{len: 3, init: 1}.map(it*2) == [2,2,2]
196+
}

0 commit comments

Comments
 (0)