aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-06-09 19:24:24 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-06-09 19:26:32 -0400
commitb735764898412c5b9388fdf729c8ad8db43ddde5 (patch)
tree1a5873e654ff7189b236acc15516b9c6cd35a315 /src/parser.cpp
parent10e33b35368735d1911a073bcb7cbbaebee671ee (diff)
downloadzig-b735764898412c5b9388fdf729c8ad8db43ddde5.tar.gz
zig-b735764898412c5b9388fdf729c8ad8db43ddde5.zip
different array literal syntax when inferring the size
old syntax: []i32{1, 2, 3} new syntax: [_]i32{1, 2, 3} closes #1797
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 3d7bbf7801..89836f9bc8 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -288,6 +288,9 @@ static AstNode *ast_parse_prefix_op_expr(
case NodeTypeArrayType:
right = &prefix->data.array_type.child_type;
break;
+ case NodeTypeInferredArrayType:
+ right = &prefix->data.inferred_array_type.child_type;
+ break;
case NodeTypePointerType: {
// We might get two pointers from *_ptr_type_start
AstNode *child = prefix->data.pointer_type.op_expr;
@@ -1852,11 +1855,15 @@ static AstNode *ast_parse_asm_output(ParseContext *pc) {
// AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
static AsmOutput *ast_parse_asm_output_item(ParseContext *pc) {
- if (eat_token_if(pc, TokenIdLBracket) == nullptr)
- return nullptr;
-
- Token *sym_name = expect_token(pc, TokenIdSymbol);
- expect_token(pc, TokenIdRBracket);
+ Token *sym_name = eat_token_if(pc, TokenIdBracketUnderscoreBracket);
+ if (sym_name == nullptr) {
+ if (eat_token_if(pc, TokenIdLBracket) == nullptr) {
+ return nullptr;
+ } else {
+ sym_name = expect_token(pc, TokenIdSymbol);
+ expect_token(pc, TokenIdRBracket);
+ }
+ }
Token *str = expect_token(pc, TokenIdStringLiteral);
expect_token(pc, TokenIdLParen);
@@ -1871,7 +1878,7 @@ static AsmOutput *ast_parse_asm_output_item(ParseContext *pc) {
expect_token(pc, TokenIdRParen);
AsmOutput *res = allocate<AsmOutput>(1);
- res->asm_symbolic_name = token_buf(sym_name);
+ res->asm_symbolic_name = (sym_name->id == TokenIdBracketUnderscoreBracket) ? buf_create_from_str("_") : token_buf(sym_name);
res->constraint = token_buf(str);
res->variable_name = token_buf(var_name);
res->return_type = return_type;
@@ -1894,18 +1901,23 @@ static AstNode *ast_parse_asm_input(ParseContext *pc) {
// AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
static AsmInput *ast_parse_asm_input_item(ParseContext *pc) {
- if (eat_token_if(pc, TokenIdLBracket) == nullptr)
- return nullptr;
+ Token *sym_name = eat_token_if(pc, TokenIdBracketUnderscoreBracket);
+ if (sym_name == nullptr) {
+ if (eat_token_if(pc, TokenIdLBracket) == nullptr) {
+ return nullptr;
+ } else {
+ sym_name = expect_token(pc, TokenIdSymbol);
+ expect_token(pc, TokenIdRBracket);
+ }
+ }
- Token *sym_name = expect_token(pc, TokenIdSymbol);
- expect_token(pc, TokenIdRBracket);
Token *constraint = expect_token(pc, TokenIdStringLiteral);
expect_token(pc, TokenIdLParen);
AstNode *expr = ast_expect(pc, ast_parse_expr);
expect_token(pc, TokenIdRParen);
AsmInput *res = allocate<AsmInput>(1);
- res->asm_symbolic_name = token_buf(sym_name);
+ res->asm_symbolic_name = (sym_name->id == TokenIdBracketUnderscoreBracket) ? buf_create_from_str("_") : token_buf(sym_name);
res->constraint = token_buf(constraint);
res->expr = expr;
return res;
@@ -2597,6 +2609,12 @@ static AstNode *ast_parse_prefix_type_op(ParseContext *pc) {
return ptr;
}
+ Token *arr_init = eat_token_if(pc, TokenIdBracketUnderscoreBracket);
+ if (arr_init != nullptr) {
+ return ast_create_node(pc, NodeTypeInferredArrayType, arr_init);
+ }
+
+
return nullptr;
}
@@ -3003,6 +3021,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
visit_field(&node->data.array_type.child_type, visit, context);
visit_field(&node->data.array_type.align_expr, visit, context);
break;
+ case NodeTypeInferredArrayType:
+ visit_field(&node->data.array_type.child_type, visit, context);
+ break;
case NodeTypePromiseType:
visit_field(&node->data.promise_type.payload_type, visit, context);
break;