authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-19 20:48:06+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-19 20:48:06+02:00
log6f6568b1fdb30fc8574b3047470510b798307717
treedf0dda484bb618ee097207d0eb3de726b5385e0f
parentd672c20b8a8d93ba200160b3698c5edab531e091
signature Commit is signed but in an unrecognized format.

translate-c: correctly add semicolon to if statements


2 files changed, 7 insertions(+), 16 deletions(-)

src/translate_c/ast.zig+5-16
......@@ -1902,36 +1902,25 @@ fn addSemicolonIfNeeded(c: *Context, node: Node) !void {
19021902 .var_decl, .var_simple, .arg_redecl, .alias, .enum_redecl, .block, .empty_block, .block_single, .@"switch" => {},
19031903 .while_true => {
19041904 const payload = node.castTag(.while_true).?.data;
1905 return addSemicolonIfNotBlock(c, payload, .yes_if);
1905 return addSemicolonIfNotBlock(c, payload);
19061906 },
19071907 .@"while" => {
19081908 const payload = node.castTag(.@"while").?.data;
1909 return addSemicolonIfNotBlock(c, payload.body, .yes_if);
1909 return addSemicolonIfNotBlock(c, payload.body);
19101910 },
19111911 .@"if" => {
19121912 const payload = node.castTag(.@"if").?.data;
19131913 if (payload.@"else") |some|
1914 return addSemicolonIfNotBlock(c, some, .no_if);
1915 return addSemicolonIfNotBlock(c, payload.then, .no_if);
1914 return addSemicolonIfNeeded(c, some);
1915 return addSemicolonIfNotBlock(c, payload.then);
19161916 },
19171917 else => _ = try c.addToken(.semicolon, ";"),
19181918 }
19191919}
19201920
1921fn addSemicolonIfNotBlock(c: *Context, node: Node, if_needs_semicolon: enum{ yes_if, no_if}) !void {
1921fn addSemicolonIfNotBlock(c: *Context, node: Node) !void {
19221922 switch (node.tag()) {
19231923 .block, .empty_block, .block_single => {},
1924 .@"if" => {
1925 if (if_needs_semicolon == .yes_if) {
1926 _ = try c.addToken(.semicolon, ";");
1927 return;
1928 }
1929
1930 const payload = node.castTag(.@"if").?.data;
1931 if (payload.@"else") |some|
1932 return addSemicolonIfNotBlock(c, some, .no_if);
1933 return addSemicolonIfNotBlock(c, payload.then, .no_if);
1934 },
19351924 else => _ = try c.addToken(.semicolon, ";"),
19361925 }
19371926}
test/translate_c.zig+2
......@@ -10,6 +10,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1010 \\ } else {
1111 \\ int b = 2;
1212 \\ }
13 \\ if (1) if (1) {}
1314 \\}
1415 , &[_][]const u8{
1516 \\pub export fn foo() void {
......@@ -18,6 +19,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1819 \\ } else {
1920 \\ var b: c_int = 2;
2021 \\ };
22 \\ if (true) if (true) {};
2123 \\}
2224 });
2325