aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2020-03-19 21:03:38 +0100
committerLemonBoy <thatlemon@gmail.com>2020-03-21 09:54:49 +0100
commit128e70ff3a056e5b800c624f7157b00fd624509b (patch)
tree06d1c96bdf2d0ed2116bda241bbd6fa937ce0d7f /src/parser.cpp
parent153c6cf92e3459038c4ab8251a463163ac89b116 (diff)
downloadzig-128e70ff3a056e5b800c624f7157b00fd624509b.tar.gz
zig-128e70ff3a056e5b800c624f7157b00fd624509b.zip
ir: Allow errdefer with payload
Closes #1265
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp11
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);