diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 85f016da73..4533b11a80 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2052,7 +2052,11 @@ fn (mut g Gen) for_in_stmt(node ast.ForInStmt) { g.write('${g.typ(node.cond_type)} $t_expr = ') g.expr(node.cond) g.writeln(';') - g.writeln('while (1) {') + if node.key_var in ['', '_'] { + g.writeln('while (1) {') + } else { + g.writeln('for (size_t $node.key_var = 0;; ++$node.key_var) {') + } t_var := g.new_tmp_var() receiver_typ := next_fn.params[0].typ receiver_styp := g.typ(receiver_typ) diff --git a/vlib/v/gen/c/testdata/for_in.c.must_have b/vlib/v/gen/c/testdata/for_in.c.must_have new file mode 100644 index 0000000000..3b8e53e3c7 --- /dev/null +++ b/vlib/v/gen/c/testdata/for_in.c.must_have @@ -0,0 +1,2 @@ +for (size_t ix = 0;; ++ix) { +while (1) { diff --git a/vlib/v/gen/c/testdata/for_in.out b/vlib/v/gen/c/testdata/for_in.out new file mode 100644 index 0000000000..3441231eb4 --- /dev/null +++ b/vlib/v/gen/c/testdata/for_in.out @@ -0,0 +1,9 @@ +a.2 +a.4 +a.6 +a.8 +b.0=2 +b.1=4 +b.2=6 +b.3=8 +end diff --git a/vlib/v/gen/c/testdata/for_in.vv b/vlib/v/gen/c/testdata/for_in.vv new file mode 100644 index 0000000000..2f210e1351 --- /dev/null +++ b/vlib/v/gen/c/testdata/for_in.vv @@ -0,0 +1,27 @@ +struct CustomIter { +mut: + idx int +} + +fn new_custom_iter() CustomIter { + return CustomIter{ idx: 0 } +} + +fn (mut a CustomIter) next() ?int { + if a.idx == 4 { + return error('') + } else { + a.idx++ + return a.idx * 2 + } +} + +fn main() { + for x in new_custom_iter() { + println('a.$x') + } + for ix, val in new_custom_iter() { + println('b.$ix=$val') + } + println('end') +}