diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/parse.c b/src/parse.c index 5601ee8..6bc782c 100644 --- a/src/parse.c +++ b/src/parse.c @@ -2100,9 +2100,25 @@ static AstNode* parse_member_declarator_list(Parser* p, Type* base_ty) { // member-declarator: // declarator -// TODO declarator? ':' constant-expr +// declarator ':' constant-expr +// TODO ':' constant-expr static AstNode* parse_member_declarator(Parser* p, Type* base_ty) { - return parse_declarator(p, base_ty); + AstNode* decl = parse_declarator(p, base_ty); + if (consume_token_if(p, TokenKind_colon)) { + AstNode* bit_width_node = parse_constant_expr(p); + InitData* bit_width_evaluated = eval_init_expr(bit_width_node, type_new(TypeKind_int)); + if (bit_width_evaluated->len != 1) + fatal_error("parse_member_declarator: invalid bit-field"); + if (bit_width_evaluated->blocks[0].kind != InitDataBlockKind_bytes) + fatal_error("parse_member_declarator: invalid bit-field"); + if (bit_width_evaluated->blocks[0].as.bytes.len != sizeof(int)) + fatal_error("parse_member_declarator: invalid bit-field"); + int bit_width; + memcpy(&bit_width, bit_width_evaluated->blocks[0].as.bytes.buf, sizeof(int)); + (void)bit_width; + // TODO: implement bit-fields. + } + return decl; } // enum-specifier: |
