authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-04-14 16:09:01-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-04-14 16:09:01-07:00
log3e93796e246f22bad43634682966390c15d7f936
tree322908f080d1a6a48453824919f9274ec49a727f
parent5fdefe58e43730b3ce28306b8fe28d7bd70c736d

comptime ({}) should not get an implicit semicolon

closes #292.

5 files changed, 18 insertions(+), 2 deletions(-)

src/all_types.hpp+2
...@@ -320,6 +320,7 @@ enum NodeType {...@@ -320,6 +320,7 @@ enum NodeType {
320 NodeTypeFnDecl,320 NodeTypeFnDecl,
321 NodeTypeParamDecl,321 NodeTypeParamDecl,
322 NodeTypeBlock,322 NodeTypeBlock,
323 NodeTypeGroupedExpr,
323 NodeTypeReturnExpr,324 NodeTypeReturnExpr,
324 NodeTypeDefer,325 NodeTypeDefer,
325 NodeTypeVariableDeclaration,326 NodeTypeVariableDeclaration,
...@@ -793,6 +794,7 @@ struct AstNode {...@@ -793,6 +794,7 @@ struct AstNode {
793 AstNodeFnProto fn_proto;794 AstNodeFnProto fn_proto;
794 AstNodeParamDecl param_decl;795 AstNodeParamDecl param_decl;
795 AstNodeBlock block;796 AstNodeBlock block;
797 AstNode * grouped_expr;
796 AstNodeReturnExpr return_expr;798 AstNodeReturnExpr return_expr;
797 AstNodeDefer defer;799 AstNodeDefer defer;
798 AstNodeVariableDeclaration variable_declaration;800 AstNodeVariableDeclaration variable_declaration;
src/analyze.cpp+1
...@@ -2076,6 +2076,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {...@@ -2076,6 +2076,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {
2076 case NodeTypeReturnExpr:2076 case NodeTypeReturnExpr:
2077 case NodeTypeDefer:2077 case NodeTypeDefer:
2078 case NodeTypeBlock:2078 case NodeTypeBlock:
2079 case NodeTypeGroupedExpr:
2079 case NodeTypeBinOpExpr:2080 case NodeTypeBinOpExpr:
2080 case NodeTypeUnwrapErrorExpr:2081 case NodeTypeUnwrapErrorExpr:
2081 case NodeTypeFnCallExpr:2082 case NodeTypeFnCallExpr:
src/ast_render.cpp+7
...@@ -150,6 +150,8 @@ static const char *node_type_str(NodeType node_type) {...@@ -150,6 +150,8 @@ static const char *node_type_str(NodeType node_type) {
150 return "ParamDecl";150 return "ParamDecl";
151 case NodeTypeBlock:151 case NodeTypeBlock:
152 return "Block";152 return "Block";
153 case NodeTypeGroupedExpr:
154 return "Parens";
153 case NodeTypeBinOpExpr:155 case NodeTypeBinOpExpr:
154 return "BinOpExpr";156 return "BinOpExpr";
155 case NodeTypeUnwrapErrorExpr:157 case NodeTypeUnwrapErrorExpr:
...@@ -469,6 +471,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -469,6 +471,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
469 print_indent(ar);471 print_indent(ar);
470 fprintf(ar->f, "}");472 fprintf(ar->f, "}");
471 break;473 break;
474 case NodeTypeGroupedExpr:
475 fprintf(ar->f, "(");
476 render_node_ungrouped(ar, node->data.grouped_expr);
477 fprintf(ar->f, ")");
478 break;
472 case NodeTypeReturnExpr:479 case NodeTypeReturnExpr:
473 {480 {
474 const char *return_str = return_string(node->data.return_expr.kind);481 const char *return_str = return_string(node->data.return_expr.kind);
src/ir.cpp+2
...@@ -5574,6 +5574,8 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop...@@ -5574,6 +5574,8 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop
5574 zig_unreachable();5574 zig_unreachable();
5575 case NodeTypeBlock:5575 case NodeTypeBlock:
5576 return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval);5576 return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval);
5577 case NodeTypeGroupedExpr:
5578 return ir_gen_node_raw(irb, node->data.grouped_expr, scope, lval);
5577 case NodeTypeBinOpExpr:5579 case NodeTypeBinOpExpr:
5578 return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval);5580 return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval);
5579 case NodeTypeNumberLiteral:5581 case NodeTypeNumberLiteral:
src/parser.cpp+6-2
...@@ -363,10 +363,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, size_t *token_index, bo...@@ -363,10 +363,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, size_t *token_index, bo
363 return nullptr;363 return nullptr;
364 }364 }
365 }365 }
366
367 *token_index += 1;366 *token_index += 1;
368367
369 AstNode *node = ast_parse_expression(pc, token_index, true);368 AstNode *node = ast_create_node(pc, NodeTypeGroupedExpr, l_paren);
369
370 node->data.grouped_expr = ast_parse_expression(pc, token_index, true);
370371
371 Token *r_paren = &pc->tokens->at(*token_index);372 Token *r_paren = &pc->tokens->at(*token_index);
372 *token_index += 1;373 *token_index += 1;
...@@ -2605,6 +2606,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont...@@ -2605,6 +2606,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
2605 case NodeTypeBlock:2606 case NodeTypeBlock:
2606 visit_node_list(&node->data.block.statements, visit, context);2607 visit_node_list(&node->data.block.statements, visit, context);
2607 break;2608 break;
2609 case NodeTypeGroupedExpr:
2610 visit_field(&node->data.grouped_expr, visit, context);
2611 break;
2608 case NodeTypeReturnExpr:2612 case NodeTypeReturnExpr:
2609 visit_field(&node->data.return_expr.expr, visit, context);2613 visit_field(&node->data.return_expr.expr, visit, context);
2610 break;2614 break;