diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index fefed75801..0e3986d5b1 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -764,8 +764,10 @@ pub fn (c mut Checker) index_expr(node ast.IndexExpr) table.Type { if !is_range { typ_sym := c.table.get_type_symbol(typ) index_type := c.expr(node.index) + index_type_sym := c.table.get_type_symbol(index_type) // println('index expr left=$typ_sym.name $node.pos.line_nr') - if typ_sym.kind == .array && !(table.type_idx(index_type) in table.number_idxs) { + if typ_sym.kind == .array && + (!(table.type_idx(index_type) in table.number_idxs) && index_type_sym.kind != .enum_) { c.error('non-integer index (type `$typ_sym.name`)', node.pos) } else if typ_sym.kind == .map && table.type_idx(index_type) != table.string_type_idx { diff --git a/vlib/v/table/table.v b/vlib/v/table/table.v index 4d84b6e327..ee52f79912 100644 --- a/vlib/v/table/table.v +++ b/vlib/v/table/table.v @@ -386,6 +386,11 @@ pub fn (t &Table) check(got, expected Type) bool { if got_type_sym.is_int() && exp_type_sym.is_int() { return true } + // allow enum value to be used as int + if (got_type_sym.is_int() && exp_type_sym.kind == .enum_) || + (exp_type_sym.is_int() && got_type_sym.kind == .enum_) { + return true + } // TODO if got_type_sym.is_number() && exp_type_sym.is_number() { return true