Work on unions and anonymous structs/unions.

This commit is contained in:
Christoffer Lerno
2020-04-06 23:48:51 +02:00
parent 400c38b95b
commit 96c8c77e89
9 changed files with 265 additions and 143 deletions

View File

@@ -989,11 +989,11 @@ bool parse_struct_body(Context *context, Decl *parent, Decl *visible_parent)
Decl *member;
if (context->next_tok.type != TOKEN_IDENT)
{
Token name_replacement = context->tok;
name_replacement.string = NULL;
member = decl_new_with_type(name_replacement, decl_kind, parent->visibility);
advance(context);
}
Token name_replacement = context->tok;
name_replacement.string = NULL;
member = decl_new_with_type(name_replacement, decl_kind, parent->visibility);
advance(context);
}
else
{
advance(context);
@@ -1010,6 +1010,8 @@ bool parse_struct_body(Context *context, Decl *parent, Decl *visible_parent)
advance_and_verify(context, TOKEN_IDENT);
}
if (!parse_attributes(context, member)) return false;
member->parent_struct = parent;
member->strukt.id = vec_size(parent->strukt.members);
parent->strukt.members = VECADD(parent->strukt.members, member);
if (!parse_struct_body(context, member, context->tok.type == TOKEN_IDENT ? member : visible_parent))
{
@@ -1036,6 +1038,7 @@ bool parse_struct_body(Context *context, Decl *parent, Decl *visible_parent)
unsigned index = vec_size(parent->strukt.members);
parent->strukt.members = VECADD(parent->strukt.members, member);
member->var.id = index;
member->var.parent = parent;
advance(context);
if (context->tok.type != TOKEN_COMMA) break;
}