diff options
| author | LemonBoy <thatlemon@gmail.com> | 2020-03-19 21:03:38 +0100 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2020-03-21 09:54:49 +0100 |
| commit | 128e70ff3a056e5b800c624f7157b00fd624509b (patch) | |
| tree | 06d1c96bdf2d0ed2116bda241bbd6fa937ce0d7f /src/parser.cpp | |
| parent | 153c6cf92e3459038c4ab8251a463163ac89b116 (diff) | |
| download | zig-128e70ff3a056e5b800c624f7157b00fd624509b.tar.gz zig-128e70ff3a056e5b800c624f7157b00fd624509b.zip | |
ir: Allow errdefer with payload
Closes #1265
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index cdd254962e..20ad179a75 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -879,7 +879,7 @@ static AstNode *ast_parse_container_field(ParseContext *pc) { // / KEYWORD_noasync BlockExprStatement // / KEYWORD_suspend (SEMICOLON / BlockExprStatement) // / KEYWORD_defer BlockExprStatement -// / KEYWORD_errdefer BlockExprStatement +// / KEYWORD_errdefer Payload? BlockExprStatement // / IfStatement // / LabeledStatement // / SwitchExpr @@ -923,12 +923,18 @@ static AstNode *ast_parse_statement(ParseContext *pc) { if (defer == nullptr) defer = eat_token_if(pc, TokenIdKeywordErrdefer); if (defer != nullptr) { + Token *payload = (defer->id == TokenIdKeywordErrdefer) ? + ast_parse_payload(pc) : nullptr; AstNode *statement = ast_expect(pc, ast_parse_block_expr_statement); AstNode *res = ast_create_node(pc, NodeTypeDefer, defer); + res->data.defer.kind = ReturnKindUnconditional; res->data.defer.expr = statement; - if (defer->id == TokenIdKeywordErrdefer) + if (defer->id == TokenIdKeywordErrdefer) { res->data.defer.kind = ReturnKindError; + if (payload != nullptr) + res->data.defer.err_payload = token_symbol(pc, payload); + } return res; } @@ -3032,6 +3038,7 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont break; case NodeTypeDefer: visit_field(&node->data.defer.expr, visit, context); + visit_field(&node->data.defer.err_payload, visit, context); break; case NodeTypeVariableDeclaration: visit_field(&node->data.variable_declaration.type, visit, context); |
