diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index f9d3ec7cb4..92619df292 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -1221,6 +1221,9 @@ pub fn (mut t Table) complete_interface_check() { if idecl.fields.len > info.fields.len { continue } + if idecl.typ == 0 { + continue + } // empty interface only generate type cast functions of the current module if idecl.methods.len == 0 && idecl.fields.len == 0 && tsym.mod != t.get_type_symbol(idecl.typ).mod { diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index f8ec6653ea..aa84c135ca 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2120,7 +2120,11 @@ fn (mut g Gen) for_in_stmt(node ast.ForInStmt) { } else { val_styp := g.typ(node.val_type) if node.val_type.is_ptr() { - g.write('$val_styp ${c_name(node.val_var)} = &(*($val_styp)') + if node.val_is_mut { + g.write('$val_styp ${c_name(node.val_var)} = &(*($val_styp)') + } else { + g.write('$val_styp ${c_name(node.val_var)} = (*($val_styp*)') + } } else { g.write('$val_styp ${c_name(node.val_var)} = (*($val_styp*)') } diff --git a/vlib/v/tests/for_in_map_of_pointers_test.v b/vlib/v/tests/for_in_map_of_pointers_test.v new file mode 100644 index 0000000000..242cc9ff95 --- /dev/null +++ b/vlib/v/tests/for_in_map_of_pointers_test.v @@ -0,0 +1,14 @@ +fn test_for_in_map_of_pointers() { + i := 123456 + pi := &i + println('pi: $pi') + mut my_map := map[int]&int{} + my_map[0] = pi + for k, wrong_value in my_map { + good_value := my_map[k] + println('k: $k \n wrong_value: $wrong_value \n good_value: $good_value') + up_good_value := voidptr(good_value).hex_full() + up_wrong_value := voidptr(wrong_value).hex_full() + assert up_good_value == up_wrong_value + } +}