aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-03-15 12:35:04 +0900
committernsfisis <nsfisis@gmail.com>2026-03-15 12:50:56 +0900
commitbde97571d289b989e3e376bcb4aae1648d728165 (patch)
tree52cca92febb79c0c8b9a06be452178a71cd3af10 /src
parent0947f67d5ed4cc1d70fc0226e4b3e2b8cfde641e (diff)
downloadducc-bde97571d289b989e3e376bcb4aae1648d728165.tar.gz
ducc-bde97571d289b989e3e376bcb4aae1648d728165.tar.zst
ducc-bde97571d289b989e3e376bcb4aae1648d728165.zip
feat: partially implement bit-fields (parsing only)
Diffstat (limited to 'src')
-rw-r--r--src/parse.c20
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: