Commit 6c160b8856

SamTebbs33 <samuel.tebbs@gmail.com>
2019-06-08 16:58:11
Add check for null body in if, for and while
1 parent 39bc825
Changed files (2)
src/parser.cpp
@@ -890,6 +890,11 @@ static AstNode *ast_parse_if_statement(ParseContext *pc) {
         body = ast_parse_assign_expr(pc);
     }
 
+    if (body == nullptr) {
+	Token *tok = eat_token(pc);
+        ast_error(pc, tok, "expected if body, found '%s'", token_name(tok->id));
+    }
+
     Token *err_payload = nullptr;
     AstNode *else_body = nullptr;
     if (eat_token_if(pc, TokenIdKeywordElse) != nullptr) {
@@ -994,6 +999,11 @@ static AstNode *ast_parse_for_statement(ParseContext *pc) {
         body = ast_parse_assign_expr(pc);
     }
 
+    if (body == nullptr) {
+	Token *tok = eat_token(pc);
+        ast_error(pc, tok, "expected loop body, found '%s'", token_name(tok->id));
+    }
+
     AstNode *else_body = nullptr;
     if (eat_token_if(pc, TokenIdKeywordElse) != nullptr) {
         else_body = ast_expect(pc, ast_parse_statement);
@@ -1023,6 +1033,11 @@ static AstNode *ast_parse_while_statement(ParseContext *pc) {
         body = ast_parse_assign_expr(pc);
     }
 
+    if (body == nullptr) {
+	Token *tok = eat_token(pc);
+        ast_error(pc, tok, "expected loop body, found '%s'", token_name(tok->id));
+    }
+
     Token *err_payload = nullptr;
     AstNode *else_body = nullptr;
     if (eat_token_if(pc, TokenIdKeywordElse) != nullptr) {
test/compile_errors.zig
@@ -230,6 +230,33 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
         "tmp.zig:10:25: error: expression value is ignored",
     );
 
+    cases.add(
+        "empty while loop body",
+        \\export fn a() void {
+        \\    while(true);
+        \\}
+    ,
+        "tmp.zig:2:16: error: expected loop body, found ';'",
+    );
+
+    cases.add(
+        "empty for loop body",
+        \\export fn a() void {
+        \\    for(undefined) |x|;
+        \\}
+    ,
+        "tmp.zig:2:23: error: expected loop body, found ';'",
+    );
+
+    cases.add(
+        "empty if body",
+        \\export fn a() void {
+        \\    if(true);
+        \\}
+    ,
+        "tmp.zig:2:13: error: expected if body, found ';'",
+    );
+
     cases.add(
         "import outside package path",
         \\comptime{