From 6d8a7ced24f8988b422dcf3afa7765fa437fe764 Mon Sep 17 00:00:00 2001 From: Ned Palacios Date: Fri, 6 Nov 2020 22:32:44 +0800 Subject: [PATCH] cgen: fix setting nested map elements fields (#6744) --- vlib/v/gen/cgen.v | 5 ++-- vlib/v/tests/nested_map_test.v | 50 +++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 4eae5c7169..40737b78b4 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -3512,7 +3512,8 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) { info := sym.info as table.Map elem_type_str := g.typ(info.value_type) elem_typ := g.table.get_type_symbol(info.value_type) - if g.is_assign_lhs && !g.is_array_set && elem_typ.kind != .struct_ { + get_and_set_types := elem_typ.kind in [.struct_, .map] + if g.is_assign_lhs && !g.is_array_set && !get_and_set_types { g.is_array_set = true g.write('map_set(') if !left_is_ptr { @@ -3527,7 +3528,7 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) { g.write(', &($elem_type_str[]) { ') } } else if (g.inside_map_postfix || g.inside_map_infix) || - (g.is_assign_lhs && !g.is_array_set && elem_typ.kind == .struct_) { + (g.is_assign_lhs && !g.is_array_set && get_and_set_types) { zero := g.type_default(info.value_type) g.write('(*($elem_type_str*)map_get_and_set(') if !left_is_ptr { diff --git a/vlib/v/tests/nested_map_test.v b/vlib/v/tests/nested_map_test.v index c193cd6d28..99e92881af 100644 --- a/vlib/v/tests/nested_map_test.v +++ b/vlib/v/tests/nested_map_test.v @@ -1,20 +1,32 @@ -fn test_nested_maps() { - if true{} - // - else{} - mut x := map[string]map[string]int - x["a"] = map[string]int - assert x["a"]["b"] == 0 - x["a"]["b"] = 5 - assert x["a"]["b"] == 5 - x["a"]["b"] = 7 - assert x["a"]["b"] == 7 - mut y := map[string]map[string]map[string]int - y["a"] = map[string]map[string]int - y["a"]["b"] = map[string]int - assert y["a"]["b"]["c"] == 0 - y["a"]["b"]["c"] = 5 - assert y["a"]["b"]["c"] == 5 - y["a"]["b"]["c"] = 7 - assert y["a"]["b"]["c"] == 7 +struct Foo { +mut: + name string +} + +fn test_nested_maps() { + if true { + } + // + else { + } + mut x := map[string]map[string]int{} + x['a'] = map[string]int{} + assert x['a']['b'] == 0 + x['a']['b'] = 5 + assert x['a']['b'] == 5 + x['a']['b'] = 7 + assert x['a']['b'] == 7 + mut y := map[string]map[string]map[string]int{} + y['a'] = map[string]map[string]int{} + y['a']['b'] = map[string]int{} + assert y['a']['b']['c'] == 0 + y['a']['b']['c'] = 5 + assert y['a']['b']['c'] == 5 + y['a']['b']['c'] = 7 + assert y['a']['b']['c'] == 7 + mut foos := map[string]map[string]Foo{} + foos['a']['b'] = Foo{'bar'} + assert foos['a']['b'].name == 'bar' + foos['a']['b'].name = 'baz' + assert foos['a']['b'].name == 'baz' }