diff --git a/vlib/builtin/map_test.v b/vlib/builtin/map_test.v index 2af22576c6..7ab6e72f53 100644 --- a/vlib/builtin/map_test.v +++ b/vlib/builtin/map_test.v @@ -290,3 +290,16 @@ fn test_plus_assign_string() { assert m.len == 1 assert m['one'] == '1' } + + +fn test_map_keys_to_array() { + m := {'a': 'b', 'c': 'd'} + mut arr := []string{} + for k, _ in m { + arr << k + } + sarr := arr.str() + println(sarr) + assert sarr == "['a', 'c']" +} + diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 449457a94e..69e3a5fac9 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -864,9 +864,14 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { g.writeln(';') g.writeln('array_$key_styp $keys_tmp = map_keys(&$atmp);') g.writeln('for (int $idx = 0; $idx < ${keys_tmp}.len; ++$idx) {') - g.writeln('\t$key_styp $key = (($key_styp*)${keys_tmp}.data)[$idx];') + // TODO: analyze whether it.key_type has a .clone() method and call .clone() for all types: + if it.key_type == table.string_type { + g.writeln('\t$key_styp $key = /*kkkk*/ string_clone( (($key_styp*)${keys_tmp}.data)[$idx] );') + } else { + g.writeln('\t$key_styp $key = /*kkkk*/ (($key_styp*)${keys_tmp}.data)[$idx];') + } if it.val_var != '_' { - g.write('\t$val_styp ${c_name(it.val_var)} = (*($val_styp*)map_get($atmp') + g.write('\t$val_styp ${c_name(it.val_var)} = /*vvv*/ (*($val_styp*)map_get($atmp') g.writeln(', $key, &($val_styp[]){ $zero }));') } g.stmts(it.stmts)