diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index faab350cda..0b89c3f97f 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -336,7 +336,7 @@ pub: left Expr index Expr // [0], [start..end] etc mut: - container_type table.Type // array, map, fixed array + left_type table.Type // array, map, fixed array is_setter bool } diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 4b68c8e9a1..4a309716e6 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1059,6 +1059,7 @@ pub fn (c mut Checker) postfix_expr(node ast.PostfixExpr) table.Type { pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type { typ := c.expr(node.left) + node.left_type = typ mut is_range := false // TODO is_range := node.index is ast.RangeExpr match node.index { ast.RangeExpr { @@ -1072,7 +1073,6 @@ pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type { } else {} } - node.container_type = typ typ_sym := c.table.get_type_symbol(typ) if !is_range { index_type := c.expr(node.index) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 7da8751dcf..716060e696 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -1616,7 +1616,7 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) { mut is_range := false match node.index { ast.RangeExpr { - sym := g.table.get_type_symbol(node.container_type) + sym := g.table.get_type_symbol(node.left_type) is_range = true if sym.kind == .string { g.write('string_substr(') @@ -1662,8 +1662,9 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) { else {} } if !is_range { - sym := g.table.get_type_symbol(node.container_type) - if table.type_is_variadic(node.container_type) { + sym := g.table.get_type_symbol(node.left_type) + left_is_ptr := table.type_is_ptr(node.left_type) + if table.type_is_variadic(node.left_type) { g.expr(node.left) g.write('.args') g.write('[') @@ -1684,7 +1685,10 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) { } if g.is_assign_lhs && !is_selector && node.is_setter { g.is_array_set = true - g.write('array_set(&') + g.write('array_set(') + if !left_is_ptr { + g.write('&') + } g.expr(node.left) g.write(', ') g.expr(node.index) @@ -1719,7 +1723,10 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) { elem_type_str := g.typ(info.value_type) if g.is_assign_lhs { g.is_array_set = true - g.write('map_set(&') + g.write('map_set(') + if !left_is_ptr { + g.write('&') + } g.expr(node.left) g.write(', ') g.expr(node.index) @@ -1741,7 +1748,7 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) { g.write(', &($elem_type_str[]){ $zero }))') } } - else if sym.kind == .string && !table.type_is_ptr(node.container_type) { + else if sym.kind == .string && !table.type_is_ptr(node.left_type) { g.write('string_at(') g.expr(node.left) g.write(', ')