mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix complex map_fixed_array (#8209)
This commit is contained in:
parent
f13ba3a9a8
commit
59c3e98c16
@ -1950,6 +1950,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||||||
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
|
is_fixed_array_copy := right_sym.kind == .array_fixed && val is ast.Ident
|
||||||
g.is_assign_lhs = true
|
g.is_assign_lhs = true
|
||||||
|
g.assign_op = assign_stmt.op
|
||||||
if is_interface && right_sym.kind == .interface_ {
|
if is_interface && right_sym.kind == .interface_ {
|
||||||
is_interface = false
|
is_interface = false
|
||||||
}
|
}
|
||||||
@ -1969,25 +1970,42 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||||||
if right.has_val {
|
if right.has_val {
|
||||||
for j, expr in right.exprs {
|
for j, expr in right.exprs {
|
||||||
g.expr(left)
|
g.expr(left)
|
||||||
g.write('[$j] = ')
|
if g.is_array_set {
|
||||||
|
g.out.go_back(2)
|
||||||
|
} else {
|
||||||
|
g.write('[$j] = ')
|
||||||
|
}
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.writeln(';')
|
if g.is_array_set {
|
||||||
|
g.writeln(')')
|
||||||
|
g.is_array_set = false
|
||||||
|
} else {
|
||||||
|
g.writeln(';')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fixed_array := right_sym.info as table.ArrayFixed
|
fixed_array := right_sym.info as table.ArrayFixed
|
||||||
for j in 0 .. fixed_array.size {
|
for j in 0 .. fixed_array.size {
|
||||||
g.expr(left)
|
g.expr(left)
|
||||||
g.write('[$j] = ')
|
if g.is_array_set {
|
||||||
|
g.out.go_back(2)
|
||||||
|
} else {
|
||||||
|
g.write('[$j] = ')
|
||||||
|
}
|
||||||
if right.has_default {
|
if right.has_default {
|
||||||
g.expr(right.default_expr)
|
g.expr(right.default_expr)
|
||||||
} else {
|
} else {
|
||||||
g.write(g.type_default(right.elem_type))
|
g.write(g.type_default(right.elem_type))
|
||||||
}
|
}
|
||||||
g.writeln(';')
|
if g.is_array_set {
|
||||||
|
g.writeln(')')
|
||||||
|
g.is_array_set = false
|
||||||
|
} else {
|
||||||
|
g.writeln(';')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
g.assign_op = assign_stmt.op
|
|
||||||
is_inside_ternary := g.inside_ternary != 0
|
is_inside_ternary := g.inside_ternary != 0
|
||||||
cur_line := if is_inside_ternary && is_decl {
|
cur_line := if is_inside_ternary && is_decl {
|
||||||
g.register_ternary_name(ident.name)
|
g.register_ternary_name(ident.name)
|
||||||
|
10
vlib/v/tests/map_complex_fixed_array_test.v
Normal file
10
vlib/v/tests/map_complex_fixed_array_test.v
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
fn foo(mut m map[string][1][2]map[string]int) {
|
||||||
|
m['foo'] = [[{'bar': 1}, {'baz':3}]!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_complex_map_fixed_array() {
|
||||||
|
mut m := map[string][1][2]map[string]int
|
||||||
|
foo(mut m)
|
||||||
|
println(m)
|
||||||
|
assert '$m' == "{'foo': [[{'bar': 1}, {'baz': 3}]]}"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user