cgen: fix multiple assign array index (#10926)
parent
26db3b0995
commit
f5776eb259
|
@ -2230,6 +2230,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
}
|
}
|
||||||
mut return_type := ast.void_type
|
mut return_type := ast.void_type
|
||||||
is_decl := assign_stmt.op == .decl_assign
|
is_decl := assign_stmt.op == .decl_assign
|
||||||
|
g.assign_op = assign_stmt.op
|
||||||
op := if is_decl { token.Kind.assign } else { assign_stmt.op }
|
op := if is_decl { token.Kind.assign } else { assign_stmt.op }
|
||||||
right_expr := assign_stmt.right[0]
|
right_expr := assign_stmt.right[0]
|
||||||
match right_expr {
|
match right_expr {
|
||||||
|
@ -2359,6 +2360,22 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
}
|
}
|
||||||
g.expr(lx)
|
g.expr(lx)
|
||||||
noscan := if is_auto_heap { g.check_noscan(return_type) } else { '' }
|
noscan := if is_auto_heap { g.check_noscan(return_type) } else { '' }
|
||||||
|
if g.is_arraymap_set {
|
||||||
|
if is_opt {
|
||||||
|
mr_base_styp := g.base_type(return_type)
|
||||||
|
if is_auto_heap {
|
||||||
|
g.writeln('HEAP${noscan}($mr_base_styp, *($mr_base_styp*)${mr_var_name}.data).arg$i) });')
|
||||||
|
} else {
|
||||||
|
g.writeln('(*($mr_base_styp*)${mr_var_name}.data).arg$i });')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if is_auto_heap {
|
||||||
|
g.writeln('HEAP${noscan}($styp, ${mr_var_name}.arg$i) });')
|
||||||
|
} else {
|
||||||
|
g.writeln('${mr_var_name}.arg$i });')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if is_opt {
|
if is_opt {
|
||||||
mr_base_styp := g.base_type(return_type)
|
mr_base_styp := g.base_type(return_type)
|
||||||
if is_auto_heap {
|
if is_auto_heap {
|
||||||
|
@ -2374,6 +2391,10 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if g.is_arraymap_set {
|
||||||
|
g.is_arraymap_set = false
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
fn round(a int, b int, c int) (int, int, int) {
|
||||||
|
mut ax := a
|
||||||
|
mut bx := b
|
||||||
|
mut cx := c
|
||||||
|
|
||||||
|
ax += bx
|
||||||
|
bx ^= cx
|
||||||
|
cx -= 1
|
||||||
|
|
||||||
|
return ax, bx, cx
|
||||||
|
}
|
||||||
|
|
||||||
|
fn round_assignment(mut res []int) {
|
||||||
|
_ = res[2]
|
||||||
|
res[0], res[1], res[2] = round(res[0], res[1], res[2])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_multiple_assign_array_index() {
|
||||||
|
mut a := []int{len: 3}
|
||||||
|
round_assignment(mut a)
|
||||||
|
|
||||||
|
println(a)
|
||||||
|
assert a == [0, 0, -1]
|
||||||
|
}
|
Loading…
Reference in New Issue