1
0
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:
yuyi 2023-03-18 05:12:59 +08:00 committed by GitHub
parent 24ea00da0c
commit 268cee82fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 2 deletions

View File

@ -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

View File

@ -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 {

View 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
}