diff options
| author | LemonBoy <thatlemon@gmail.com> | 2020-01-04 11:49:43 +0100 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2020-01-04 11:49:43 +0100 |
| commit | a712ea333b9ddb140331c159d23d16ef6ed4ef14 (patch) | |
| tree | b77ee53815e969a40198b1edc912ce773cf1e9e5 | |
| parent | 51e430fac01a4b36a61d4c626d7c25158898e216 (diff) | |
| download | zig-a712ea333b9ddb140331c159d23d16ef6ed4ef14.tar.gz zig-a712ea333b9ddb140331c159d23d16ef6ed4ef14.zip | |
Fix translation of for loop init
Closes #4067
| -rw-r--r-- | src-self-hosted/translate_c.zig | 10 | ||||
| -rw-r--r-- | test/translate_c.zig | 15 |
2 files changed, 21 insertions, 4 deletions
diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 7f98ff2686..57e67d4dd5 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -2119,14 +2119,16 @@ fn transForLoop( .parent = scope, .id = .Loop, }; - var block = false; + var block_scope: ?*Scope.Block = null; if (ZigClangForStmt_getInit(stmt)) |init| { block_scope = try Scope.Block.init(rp.c, scope, null); - block_scope.?.block_node = try transCreateNodeBlock(rp.c, null); + const block = try transCreateNodeBlock(rp.c, null); + block_scope.?.block_node = block; loop_scope.parent = &block_scope.?.base; - const init_stmt = try transStmt(rp, &loop_scope, init, .unused, .r_value); - try block_scope.?.block_node.statements.push(init_stmt); + const result = try transStmt(rp, &block_scope.?.base, init, .unused, .r_value); + if (result != &block.base) + try block.statements.push(result); } var cond_scope = Scope{ .parent = scope, diff --git a/test/translate_c.zig b/test/translate_c.zig index 98cf3df996..42b72e7cb9 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -696,6 +696,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\} }); + cases.add("for loop with simple init expression", + \\void foo(void) { + \\ int i; + \\ for (i = 3; i; i--) { } + \\} + , &[_][]const u8{ + \\pub export fn foo() void { + \\ var i: c_int = undefined; + \\ { + \\ i = 3; + \\ while (i != 0) : (i -= 1) {} + \\ } + \\} + }); + cases.add("break statement", \\void foo(void) { \\ for (;;) { |
