diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-12-21 14:11:16 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-12-21 14:11:16 -0500 |
| commit | bc95c63cf227226861d7fbf63fa6c779fed8abf8 (patch) | |
| tree | 1e004f521047ead2fb52855da7bc4fa819020548 /src/parser.cpp | |
| parent | 51cbd968203f348051b8c2bdc005ca5294a79ceb (diff) | |
| parent | 290dc5d95b986464a5be91bb3fd0ada2dd0840ae (diff) | |
| download | zig-bc95c63cf227226861d7fbf63fa6c779fed8abf8.tar.gz zig-bc95c63cf227226861d7fbf63fa6c779fed8abf8.zip | |
Merge pull request #3940 from ziglang/sentinel-slicing
fix std.mem.addNullByte and implement sentinel slicing
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 4b5e0e3ebb..a0c5cf794b 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2723,7 +2723,7 @@ static AstNode *ast_parse_prefix_type_op(ParseContext *pc) { } // SuffixOp -// <- LBRACKET Expr (DOT2 Expr?)? RBRACKET +// <- LBRACKET Expr (DOT2 (Expr (COLON Expr)?)?)? RBRACKET // / DOT IDENTIFIER // / DOTASTERISK // / DOTQUESTIONMARK @@ -2733,12 +2733,17 @@ static AstNode *ast_parse_suffix_op(ParseContext *pc) { AstNode *start = ast_expect(pc, ast_parse_expr); AstNode *end = nullptr; if (eat_token_if(pc, TokenIdEllipsis2) != nullptr) { + AstNode *sentinel = nullptr; end = ast_parse_expr(pc); + if (eat_token_if(pc, TokenIdColon) != nullptr) { + sentinel = ast_parse_expr(pc); + } expect_token(pc, TokenIdRBracket); AstNode *res = ast_create_node(pc, NodeTypeSliceExpr, lbracket); res->data.slice_expr.start = start; res->data.slice_expr.end = end; + res->data.slice_expr.sentinel = sentinel; return res; } @@ -3041,6 +3046,7 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont visit_field(&node->data.slice_expr.array_ref_expr, visit, context); visit_field(&node->data.slice_expr.start, visit, context); visit_field(&node->data.slice_expr.end, visit, context); + visit_field(&node->data.slice_expr.sentinel, visit, context); break; case NodeTypeFieldAccessExpr: visit_field(&node->data.field_access_expr.struct_expr, visit, context); |
