mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix map of complex array (#17660)
This commit is contained in:
parent
24ea00da0c
commit
268cee82fc
@ -123,6 +123,7 @@ mut:
|
||||
inside_map_infix bool // inside map<</+=/-= infix expr
|
||||
inside_assign bool
|
||||
inside_map_index bool
|
||||
inside_array_index bool
|
||||
inside_opt_or_res bool
|
||||
inside_opt_data bool
|
||||
inside_if_option bool
|
||||
|
@ -202,7 +202,14 @@ fn (mut g Gen) index_of_array(node ast.IndexExpr, sym ast.TypeSymbol) {
|
||||
g.write('&')
|
||||
}
|
||||
}
|
||||
g.expr(node.left)
|
||||
if node.left is ast.IndexExpr {
|
||||
g.inside_array_index = true
|
||||
g.expr(node.left)
|
||||
g.inside_array_index = false
|
||||
} else {
|
||||
g.expr(node.left)
|
||||
}
|
||||
|
||||
if node.left_type.has_flag(.shared_f) {
|
||||
if left_is_ptr {
|
||||
g.write('->val')
|
||||
@ -393,7 +400,7 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) {
|
||||
g.typ(elem_type.clear_flag(.option).clear_flag(.result))
|
||||
}
|
||||
}
|
||||
get_and_set_types := elem_sym.kind in [.struct_, .map]
|
||||
get_and_set_types := elem_sym.kind in [.struct_, .map, .array]
|
||||
if g.is_assign_lhs && !g.is_arraymap_set && !get_and_set_types {
|
||||
if g.assign_op == .assign || info.value_type == ast.string_type {
|
||||
g.is_arraymap_set = true
|
||||
@ -434,6 +441,7 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) {
|
||||
g.write('${zero} })))')
|
||||
}
|
||||
} else if g.inside_map_postfix || g.inside_map_infix || g.inside_map_index
|
||||
|| g.inside_array_index
|
||||
|| (g.is_assign_lhs && !g.is_arraymap_set && get_and_set_types) {
|
||||
zero := g.type_default(info.value_type)
|
||||
if node.is_setter {
|
||||
|
19
vlib/v/tests/map_complex_array_test.v
Normal file
19
vlib/v/tests/map_complex_array_test.v
Normal file
@ -0,0 +1,19 @@
|
||||
struct Instr {
|
||||
mut:
|
||||
a int
|
||||
b int
|
||||
}
|
||||
|
||||
fn test_map_complex_array() {
|
||||
mut map1 := map[string][]&Instr{}
|
||||
instr := &Instr{
|
||||
a: 1
|
||||
b: 2
|
||||
}
|
||||
arr := [instr]
|
||||
map1['Hello'] = arr
|
||||
map1['Hello'][0].a = 2
|
||||
println(map1['Hello'][0].a)
|
||||
assert map1['Hello'][0].a == 2
|
||||
assert map1['Hello'][0].b == 2
|
||||
}
|
Loading…
Reference in New Issue
Block a user