cgen: fix assignment of fixed array var to another var (#7429)
parent
c9171ebe9a
commit
f0391f7a8f
|
@ -79,3 +79,25 @@ fn test_merge() {
|
||||||
assert merge<int>(a, c) == a
|
assert merge<int>(a, c) == a
|
||||||
assert merge<int>(d, b) == b
|
assert merge<int>(d, b) == b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_fixed_array_assignment() {
|
||||||
|
mut a := [2]int{}
|
||||||
|
a[0] = 111
|
||||||
|
a[1] = 222
|
||||||
|
b := a
|
||||||
|
assert b[0] == a[0]
|
||||||
|
assert b[1] == a[1]
|
||||||
|
mut c := [2]int{}
|
||||||
|
c = a
|
||||||
|
assert c[0] == a[0]
|
||||||
|
assert c[1] == a[1]
|
||||||
|
|
||||||
|
d := [3]int{init: 333}
|
||||||
|
for val in d {
|
||||||
|
assert val == 333
|
||||||
|
}
|
||||||
|
e := [3]string{init: 'vlang'}
|
||||||
|
for val in e {
|
||||||
|
assert val == 'vlang'
|
||||||
|
}
|
||||||
|
}
|
|
@ -1842,6 +1842,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
right_sym := g.table.get_type_symbol(val_type)
|
right_sym := g.table.get_type_symbol(val_type)
|
||||||
|
is_fixed_array_copy := right_sym.kind == .array_fixed && val is ast.Ident
|
||||||
g.is_assign_lhs = true
|
g.is_assign_lhs = true
|
||||||
if is_interface && right_sym.kind == .interface_ {
|
if is_interface && right_sym.kind == .interface_ {
|
||||||
is_interface = false
|
is_interface = false
|
||||||
|
@ -1857,7 +1858,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
g.expr(val)
|
g.expr(val)
|
||||||
g.writeln(';}')
|
g.writeln(';}')
|
||||||
}
|
}
|
||||||
} else if right_sym.kind == .array_fixed && assign_stmt.op == .assign {
|
} else if is_fixed_array_init && assign_stmt.op == .assign {
|
||||||
right := val as ast.ArrayInit
|
right := val as ast.ArrayInit
|
||||||
if right.has_val {
|
if right.has_val {
|
||||||
for j, expr in right.exprs {
|
for j, expr in right.exprs {
|
||||||
|
@ -1925,7 +1926,9 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
if left is ast.Ident || left is ast.SelectorExpr {
|
if left is ast.Ident || left is ast.SelectorExpr {
|
||||||
g.prevent_sum_type_unwrapping_once = true
|
g.prevent_sum_type_unwrapping_once = true
|
||||||
}
|
}
|
||||||
g.expr(left)
|
if !is_fixed_array_copy || is_decl {
|
||||||
|
g.expr(left)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if is_inside_ternary && is_decl {
|
if is_inside_ternary && is_decl {
|
||||||
g.write(';\n$cur_line')
|
g.write(';\n$cur_line')
|
||||||
|
@ -1934,7 +1937,11 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
}
|
}
|
||||||
g.is_assign_lhs = false
|
g.is_assign_lhs = false
|
||||||
g.is_assign_rhs = true
|
g.is_assign_rhs = true
|
||||||
if !g.is_array_set && !str_add {
|
if is_fixed_array_copy {
|
||||||
|
if is_decl {
|
||||||
|
g.writeln(';')
|
||||||
|
}
|
||||||
|
} else if !g.is_array_set && !str_add {
|
||||||
g.write(' $op ')
|
g.write(' $op ')
|
||||||
} else if str_add {
|
} else if str_add {
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
|
@ -1963,7 +1970,16 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
}
|
}
|
||||||
g.is_shared = var_type.has_flag(.shared_f)
|
g.is_shared = var_type.has_flag(.shared_f)
|
||||||
if !cloned {
|
if !cloned {
|
||||||
if is_decl {
|
if is_fixed_array_copy {
|
||||||
|
i_var := g.new_tmp_var()
|
||||||
|
fixed_array := right_sym.info as table.ArrayFixed
|
||||||
|
g.write('for(int $i_var=0; $i_var<$fixed_array.size; $i_var++) {')
|
||||||
|
g.expr(left)
|
||||||
|
g.write('[$i_var] = ')
|
||||||
|
g.expr(val)
|
||||||
|
g.write('[$i_var];')
|
||||||
|
g.writeln('}')
|
||||||
|
} else if is_decl {
|
||||||
if is_fixed_array_init && !has_val {
|
if is_fixed_array_init && !has_val {
|
||||||
if val is ast.ArrayInit {
|
if val is ast.ArrayInit {
|
||||||
if val.has_default {
|
if val.has_default {
|
||||||
|
|
Loading…
Reference in New Issue