diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index a18bf034ea..71c6859f9e 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -225,12 +225,15 @@ pub fn (c mut Checker) array_init(array_init mut ast.ArrayInit) table.Type { c.error('expected array element with type `$elem_type_sym.name`', array_init.pos) } } - // idx := if is_fixed { p.table.find_or_register_array_fixed(val_type, fixed_size, 1) } else { p.table.find_or_register_array(val_type, 1) } - is_fixed := false - fixed_size := 1 - idx := if is_fixed { c.table.find_or_register_array_fixed(elem_type, fixed_size, 1) } else { c.table.find_or_register_array(elem_type, 1) } - array_type := table.new_type(idx) - array_init.typ = array_type + // only inits if know types like []string set the type in parser + // as the rest could be result of expression, so do it here + if array_init.typ == 0 { + is_fixed := false + fixed_size := 1 + idx := if is_fixed { c.table.find_or_register_array_fixed(elem_type, fixed_size, 1) } else { c.table.find_or_register_array(elem_type, 1) } + array_type := table.new_type(idx) + array_init.typ = array_type + } return array_init.typ } @@ -536,7 +539,7 @@ pub fn (c mut Checker) index_expr(node ast.IndexExpr) table.Type { typ = info.elem_type } */ - mut typ := c.expr(node.left) + typ := c.expr(node.left) mut is_range := false // TODO is_range := node.index is ast.RangeExpr match node.index { ast.RangeExpr { @@ -544,20 +547,19 @@ pub fn (c mut Checker) index_expr(node ast.IndexExpr) table.Type { } else {} } - typ_sym := c.table.get_type_symbol(typ) if !is_range { index_type := c.expr(node.index) - // if index_type.typ.kind != .int { if table.type_idx(index_type) != table.int_type_idx { index_type_sym := c.table.get_type_symbol(index_type) c.error('non-integer index (type `$index_type_sym.name`)', node.pos) } + typ_sym := c.table.get_type_symbol(typ) if typ_sym.kind == .array { // Check index type info := typ_sym.info as table.Array return info.elem_type } - if typ_sym.kind == .array_fixed { + else if typ_sym.kind == .array_fixed { info := typ_sym.info as table.ArrayFixed return info.elem_type } @@ -565,9 +567,12 @@ pub fn (c mut Checker) index_expr(node ast.IndexExpr) table.Type { info := typ_sym.info as table.Map return info.value_type } - else { - typ = table.int_type + else if typ_sym.kind in [.byteptr, .string] { + return table.byte_type } + //else { + // return table.int_type + //} } return typ } diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index c6e8061a41..3c8c5a8f9f 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -634,7 +634,6 @@ pub fn (p mut Parser) expr(precedence int) (ast.Expr,table.Type) { node = p.if_expr() } .lsbr { - // node,typ = p.array_init() node = p.array_init() } .key_none { @@ -1105,9 +1104,7 @@ fn (p mut Parser) string_expr() (ast.Expr,table.Type) { return node,table.string_type } -// fn (p mut Parser) array_init() (ast.Expr,table.Type) { -fn (p mut Parser) array_init() ast.Expr { - mut node := ast.Expr{} +fn (p mut Parser) array_init() ast.ArrayInit { p.check(.lsbr) // `[]` - empty array with an automatically deduced type // p.warn('array_init() exp=$p.expected_type') @@ -1130,7 +1127,7 @@ fn (p mut Parser) array_init() ast.Expr { } */ - mut val_type := table.void_type + mut array_type := table.Type(0) mut exprs := []ast.Expr // mut is_fixed := false // mut fixed_size := 0 @@ -1140,7 +1137,11 @@ fn (p mut Parser) array_init() ast.Expr { p.check(.rsbr) // []string if p.tok.kind == .name && p.tok.line_nr == line_nr { - val_type = p.parse_type() + val_type := p.parse_type() + // this is set here becasue its a known type, others could be the + // result of expr so we do those in checker + idx := p.table.find_or_register_array(val_type, 1) + array_type = table.new_type(idx) } // [] else { @@ -1151,11 +1152,8 @@ fn (p mut Parser) array_init() ast.Expr { else { // [1,2,3] for i := 0; p.tok.kind != .rsbr; i++ { - expr,typ := p.expr(0) + expr,_ := p.expr(0) exprs << expr - if i == 0 { - val_type = typ - } if p.tok.kind == .comma { p.check(.comma) } @@ -1181,12 +1179,11 @@ fn (p mut Parser) array_init() ast.Expr { } // idx := if is_fixed { p.table.find_or_register_array_fixed(val_type, fixed_size, 1) } else { p.table.find_or_register_array(val_type, 1) } // array_type := table.new_type(idx) - node = ast.ArrayInit{ - // typ: array_type + return ast.ArrayInit{ + typ: array_type exprs: exprs pos: p.tok.position() } - return node } fn (p mut Parser) parse_number_literal() (ast.Expr,table.Type) {