diff --git a/src/ast_render.cpp b/src/ast_render.cpp index ef1fe6e231..f88feee856 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -490,7 +490,10 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { AstNode *statement = node->data.block.statements.at(i); print_indent(ar); render_node_grouped(ar, statement); - fprintf(ar->f, ";"); + + if (!statement_terminates_without_semicolon(statement)) + fprintf(ar->f, ";"); + fprintf(ar->f, "\n"); } ar->indent -= ar->indent_size; diff --git a/src/parser.cpp b/src/parser.cpp index 738d19a1c1..c7675ad67d 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2315,7 +2315,7 @@ static AstNode *ast_parse_expression(ParseContext *pc, size_t *token_index, bool return nullptr; } -static bool statement_terminates_without_semicolon(AstNode *node) { +bool statement_terminates_without_semicolon(AstNode *node) { switch (node->type) { case NodeTypeIfBoolExpr: if (node->data.if_bool_expr.else_node) diff --git a/src/parser.hpp b/src/parser.hpp index 6e9f002997..21922db4ed 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -23,4 +23,6 @@ void ast_print(AstNode *node, int indent); void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *context), void *context); +bool statement_terminates_without_semicolon(AstNode *node); + #endif diff --git a/test/translate_c.zig b/test/translate_c.zig index e1aa648d73..8073e29151 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -351,7 +351,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ var i: c_int = 0; \\ while (a > c_uint(0)) { \\ a >>= @import("std").math.Log2Int(c_uint)(1); - \\ }; + \\ } \\ return i; \\} ); @@ -498,7 +498,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ var i: c_int = 0; \\ while (a > c_uint(0)) { \\ a >>= u5(1); - \\ }; + \\ } \\ return i; \\} ); @@ -867,12 +867,12 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ while (true) { \\ a -= 1; \\ if (!(a != 0)) break; - \\ }; + \\ } \\ var b: c_int = 2; \\ while (true) { \\ b -= 1; \\ if (!(b != 0)) break; - \\ }; + \\ } \\} ); @@ -962,8 +962,8 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\pub fn foo() void { \\ { \\ var i: c_int = 0; - \\ while (i < 10) : (i += 1) {}; - \\ }; + \\ while (i < 10) : (i += 1) {} + \\ } \\} ); @@ -973,7 +973,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\} , \\pub fn foo() void { - \\ while (true) {}; + \\ while (true) {} \\} ); @@ -987,7 +987,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\pub fn foo() void { \\ while (true) { \\ break; - \\ }; + \\ } \\} ); @@ -1001,7 +1001,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\pub fn foo() void { \\ while (true) { \\ continue; - \\ }; + \\ } \\} ); @@ -1058,7 +1058,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ { \\ var x_0: c_int = 2; \\ x_0 += 1; - \\ }; + \\ } \\ return x; \\} ); @@ -1147,7 +1147,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ return 0; \\ } else { \\ return 1; - \\ }; + \\ } \\} ); @@ -1164,7 +1164,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ break :__to_bool_expr @bitCast(@IntType(false, @sizeOf(@typeOf(_tmp)) * 8), _tmp) != 0; \\ }) { \\ return 0; - \\ }; + \\ } \\} ); @@ -1185,7 +1185,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ break :__to_bool_expr @bitCast(@IntType(false, @sizeOf(@typeOf(_tmp)) * 8), _tmp) != 0; \\ }) { \\ return 0; - \\ }; + \\ } \\ { \\ var j: c_int = 4; \\ while (__to_bool_expr: { @@ -1193,8 +1193,8 @@ pub fn addCases(cases: &tests.TranslateCContext) void { \\ break :__to_bool_expr @bitCast(@IntType(false, @sizeOf(@typeOf(_tmp)) * 8), _tmp) != 0; \\ }) : (j -= 1) { \\ return 0; - \\ }; - \\ }; + \\ } + \\ } \\} ); }