Skip to content

Commit 7b77f2e

Browse files
authored
cgen: fix translated file fixed-array assignment (#25080)
1 parent 652881c commit 7b77f2e

2 files changed

Lines changed: 47 additions & 4 deletions

File tree

‎vlib/v/gen/c/assign.v‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -508,12 +508,14 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
508508
unwrapped_val_type := g.unwrap_generic(val_type)
509509
right_sym := g.table.sym(unwrapped_val_type)
510510
unaliased_right_sym := g.table.final_sym(unwrapped_val_type)
511-
is_fixed_array_var := !g.pref.translated && unaliased_right_sym.kind == .array_fixed
512-
&& val !is ast.ArrayInit
511+
unaliased_left_sym := g.table.final_sym(g.unwrap_generic(var_type))
512+
is_fixed_array_var := unaliased_right_sym.kind == .array_fixed && val !is ast.ArrayInit
513513
&& (val in [ast.Ident, ast.IndexExpr, ast.CallExpr, ast.SelectorExpr, ast.DumpExpr, ast.InfixExpr]
514514
|| (val is ast.CastExpr && val.expr !is ast.ArrayInit)
515515
|| (val is ast.PrefixExpr && val.op == .arrow)
516516
|| (val is ast.UnsafeExpr && val.expr in [ast.SelectorExpr, ast.Ident, ast.CallExpr]))
517+
&& !((g.pref.translated || g.file.is_translated)
518+
&& unaliased_left_sym.kind != .array_fixed)
517519
g.is_assign_lhs = true
518520
g.assign_op = node.op
519521

@@ -553,10 +555,18 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
553555
}
554556
g.writeln(';}')
555557
}
556-
} else if node.op == .assign && !g.pref.translated && (is_fixed_array_init
558+
} else if node.op == .assign && (is_fixed_array_init
557559
|| (unaliased_right_sym.kind == .array_fixed && val in [ast.Ident, ast.CastExpr])) {
558560
// Fixed arrays
559-
if is_fixed_array_init && var_type.has_flag(.option) {
561+
if unaliased_left_sym.kind != .array_fixed && unaliased_right_sym.kind == .array_fixed
562+
&& (g.pref.translated || g.file.is_translated) {
563+
// translated:
564+
// arr = [5]u8{}
565+
// ptr = arr => ptr = &arr[0]
566+
g.expr(left)
567+
g.write(' = ')
568+
g.expr(val)
569+
} else if is_fixed_array_init && var_type.has_flag(.option) {
560570
g.expr(left)
561571
g.write(' = ')
562572
g.expr_with_opt(val, val_type, var_type)

‎vlib/v/tests/translated_test.v‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,36 @@ const ssf = [1, 2, 3]!
1212
fn test_const_name_without_main_prefix() {
1313
assert ssf[0] == 1
1414
}
15+
16+
struct ASMOperand {
17+
constraint [2]i8
18+
}
19+
20+
fn test_pointer_assign_without_memcpy() {
21+
op := ASMOperand{
22+
constraint: [i8(5), 4]!
23+
}
24+
str := &i8(0)
25+
str = op.constraint
26+
assert !isnil(str)
27+
28+
ops := [3]ASMOperand{}
29+
pop := &ASMOperand(0)
30+
pop = ops
31+
assert pop[1].constraint[0] == 0
32+
}
33+
34+
struct StubIndex {
35+
pub mut:
36+
data [5][5]map[string]string
37+
}
38+
39+
fn test_pointer_assign_with_memcpy() {
40+
mut s := StubIndex{}
41+
s.data[1] = [5]map[string]string{}
42+
43+
mut data := s.data[1]
44+
data[0]['abc'] = '123'
45+
k := data[0]['abc']
46+
assert k == '123'
47+
}

0 commit comments

Comments
 (0)