diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-01-09 01:31:03 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-01-09 01:32:18 +0900 |
| commit | c40c49de2c318ded0aa127e5faccc9054df6e30e (patch) | |
| tree | 13db534b6a417049cb104b72907aa7c139d3bb4c | |
| parent | 1e89f9ff938ed458e8be8904bb29b7ced406f9d5 (diff) | |
| download | ducc-c40c49de2c318ded0aa127e5faccc9054df6e30e.tar.gz ducc-c40c49de2c318ded0aa127e5faccc9054df6e30e.tar.zst ducc-c40c49de2c318ded0aa127e5faccc9054df6e30e.zip | |
feat: support declarations to declare multiple members at once
| -rw-r--r-- | src/parse.c | 21 | ||||
| -rw-r--r-- | tests/struct_basics.sh | 17 |
2 files changed, 27 insertions, 11 deletions
diff --git a/src/parse.c b/src/parse.c index 195a3b0..a9ecbe8 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1515,24 +1515,23 @@ static AstNode* parse_member_declaration(Parser* p) { expect(p, TokenKind_semicolon); - if (decls->node_len != 1) - unimplemented(); - - AstNode* m = ast_new(AstNodeKind_struct_member); - m->name = decls->node_items[0].name; - m->ty = decls->node_items[0].ty; - return m; + for (size_t i = 0; i < decls->node_len; i++) { + decls->node_items[i].kind = AstNodeKind_struct_member; + } + return decls; } // member-declaration-list: // { member-declaration }+ static AstNode* parse_member_declaration_list(Parser* p) { - AstNode* list = ast_new_list(4); + AstNode* members = ast_new_list(4); while (peek_token(p)->kind != TokenKind_brace_r) { - AstNode* member = parse_member_declaration(p); - ast_append(list, member); + AstNode* decls = parse_member_declaration(p); + for (size_t i = 0; i < decls->node_len; i++) { + ast_append(members, &decls->node_items[i]); + } } - return list; + return members; } static AstNode* parse_enum_member(Parser* p) { diff --git a/tests/struct_basics.sh b/tests/struct_basics.sh index 2dff3bb..13a50a5 100644 --- a/tests/struct_basics.sh +++ b/tests/struct_basics.sh @@ -118,3 +118,20 @@ int main() { return 0; } EOF + +test_exit_code 0 <<'EOF' +#include <helpers.h> + +struct S { + int a, b; +}; + +struct T { + short *a, b, c[12]; +}; + +int main() { + ASSERT_EQ(8, sizeof(struct S)); + ASSERT_EQ(40, sizeof(struct T)); +} +EOF |
