diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-02-03 11:39:24 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-02-03 11:39:24 -0500 |
| commit | 71d335e5ccc5c7c37ac40debf78ad3aa096b22d3 (patch) | |
| tree | b64024a77a76bf26ed77596125c046321edfb4ff /src/parser.cpp | |
| parent | cd7713b1788aeeadf6c46def38d4ef4fa313fe75 (diff) | |
| download | zig-71d335e5ccc5c7c37ac40debf78ad3aa096b22d3.tar.gz zig-71d335e5ccc5c7c37ac40debf78ad3aa096b22d3.zip | |
implement packed structs
closes #183
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 54081d91a7..7b7126ca40 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2275,21 +2275,24 @@ static AstNode *ast_parse_use(ParseContext *pc, size_t *token_index, VisibMod vi } /* -ContainerDecl = option("extern") ("struct" | "enum" | "union") "{" many(StructMember) "}" -StructMember = (StructField | FnDef | GlobalVarDecl) -StructField = Symbol option(":" Expression) ",") +ContainerDecl = option("extern" | "packed") ("struct" | "enum" | "union") "{" many(ContainerMember) "}" +ContainerMember = (ContainerField | FnDef | GlobalVarDecl) +ContainerField = Symbol option(":" Expression) ",") */ static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index, bool mandatory) { Token *first_token = &pc->tokens->at(*token_index); Token *container_kind_token; - bool is_extern; + ContainerLayout layout; if (first_token->id == TokenIdKeywordExtern) { container_kind_token = &pc->tokens->at(*token_index + 1); - is_extern = true; + layout = ContainerLayoutExtern; + } else if (first_token->id == TokenIdKeywordPacked) { + container_kind_token = &pc->tokens->at(*token_index + 1); + layout = ContainerLayoutPacked; } else { container_kind_token = first_token; - is_extern = false; + layout = ContainerLayoutAuto; } ContainerKind kind; @@ -2304,10 +2307,10 @@ static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index, } else { return nullptr; } - *token_index += is_extern ? 2 : 1; + *token_index += (layout == ContainerLayoutAuto) ? 1 : 2; AstNode *node = ast_create_node(pc, NodeTypeContainerDecl, first_token); - node->data.container_decl.is_extern = is_extern; + node->data.container_decl.layout = layout; node->data.container_decl.kind = kind; ast_eat_token(pc, token_index, TokenIdLBrace); |
