diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 4eb09dccdf..46560ef9df 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3485,8 +3485,12 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type { node.is_farray = true } .any { - typ = c.unwrap_generic(typ) - typ_sym = c.table.final_sym(typ) + unwrapped_typ := c.unwrap_generic(typ) + unwrapped_sym := c.table.final_sym(unwrapped_typ) + if unwrapped_sym.kind in [.map, .array, .array_fixed] { + typ = unwrapped_typ + typ_sym = unwrapped_sym + } } else {} } diff --git a/vlib/v/tests/generics_with_pointer_index_test.v b/vlib/v/tests/generics_with_pointer_index_test.v new file mode 100644 index 0000000000..32325fb509 --- /dev/null +++ b/vlib/v/tests/generics_with_pointer_index_test.v @@ -0,0 +1,62 @@ +module main + +pub struct Vec { +mut: + data &T + cap int + len int +} + +pub struct Iter { +mut: + v &Vec + pos int +} + +pub fn with_cap(cap int) Vec { + new_data := unsafe { C.malloc(cap * int(sizeof(T))) } + unsafe { C.memset(new_data, 0, cap * int(sizeof(T))) } + + return Vec{ + data: new_data + cap: cap + len: 0 + } +} + +pub fn (ar &Vec) iter() Iter { + return Iter{ + v: unsafe { ar } + } +} + +pub fn (mut iter Iter) next() ?&T { + if iter.pos >= iter.v.len { + return none + } + res := unsafe { &iter.v.data[iter.pos] } + iter.pos++ + return res +} + +pub fn (mut ar Vec) push(elm T) { + unsafe { + ar.data[ar.len - 1] = elm + } +} + +struct Product { + price f64 +} + +fn test_generic_with_pointer_index() { + vec1 := with_cap(5) + println(vec1) + assert vec1.len == 0 + assert vec1.cap == 5 + + vec2 := with_cap(5) + println(vec2) + assert vec2.len == 0 + assert vec2.cap == 5 +}