diff options
| author | Josh Wolfe <thejoshwolfe@gmail.com> | 2017-04-02 13:01:23 -0700 |
|---|---|---|
| committer | Josh Wolfe <thejoshwolfe@gmail.com> | 2017-04-02 13:01:23 -0700 |
| commit | e3c796258c766d5de857ce37eeb3bdc5bb353e68 (patch) | |
| tree | 9d48e59fec35568758c903d3197e7604e19ec0c8 | |
| parent | 136a9a9d6b657e29680ca53f158f46eb5b92e9e7 (diff) | |
| download | zig-e3c796258c766d5de857ce37eeb3bdc5bb353e68.tar.gz zig-e3c796258c766d5de857ce37eeb3bdc5bb353e68.zip | |
allow implicit semicolon after defer {}
| -rw-r--r-- | src/parser.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 77a358376b..bc08bd84b7 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1856,7 +1856,7 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo } } -static bool block_expr_has_block_body(AstNode *node) { +static bool statement_has_block_body(AstNode *node) { switch (node->type) { case NodeTypeIfBoolExpr: if (node->data.if_bool_expr.else_node) @@ -1879,6 +1879,8 @@ static bool block_expr_has_block_body(AstNode *node) { return true; case NodeTypeCompTime: return node->data.comptime_expr.expr->type == NodeTypeBlock; + case NodeTypeDefer: + return node->data.defer.expr->type == NodeTypeBlock; default: zig_unreachable(); } @@ -2123,18 +2125,16 @@ static AstNode *ast_parse_block(ParseContext *pc, size_t *token_index, bool mand statement_node = ast_parse_variable_declaration_expr(pc, token_index, false, VisibModPrivate); if (!statement_node) { statement_node = ast_parse_defer_expr(pc, token_index); - if (!statement_node) { + if (!statement_node) statement_node = ast_parse_block_expr(pc, token_index, false); - if (statement_node) { - if (block_expr_has_block_body(statement_node)) { - semicolon_expected = false; - } - } else { - statement_node = ast_parse_expression(pc, token_index, false); - if (!statement_node) { - // final semicolon means add a void statement. - need_implicit_final_void_statement = true; - } + if (statement_node) { + if (statement_has_block_body(statement_node)) + semicolon_expected = false; + } else { + statement_node = ast_parse_expression(pc, token_index, false); + if (!statement_node) { + // final semicolon means add a void statement. + need_implicit_final_void_statement = true; } } } |
