aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ast.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-03-15 12:35:04 +0900
committernsfisis <nsfisis@gmail.com>2026-05-02 18:30:18 +0900
commit76654319325efadf9ef19f4ce181397ad53f6914 (patch)
tree9600fb99a9ac71766a9f5c9fd0b95541e39a34e7 /src/ast.c
parent2e308aca586b243b96c8e6c817f748d551cf7468 (diff)
downloadducc-76654319325efadf9ef19f4ce181397ad53f6914.tar.gz
ducc-76654319325efadf9ef19f4ce181397ad53f6914.tar.zst
ducc-76654319325efadf9ef19f4ce181397ad53f6914.zip
feat: partially implement bit-fields
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/ast.c b/src/ast.c
index 790eb81..4d30a66 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -662,8 +662,15 @@ int type_sizeof_struct(Type* ty) {
for (int i = 0; i < members_of(ty)->as.list->len; ++i) {
AstNode* member = &members_of(ty)->as.list->items[i];
- int size = type_sizeof(member->ty);
- int align = type_alignof(member->ty);
+ int size, align;
+ if (member->as.struct_member->is_bitfield) {
+ // TODO
+ size = member->as.struct_member->bitfield_width / 8;
+ align = 1;
+ } else {
+ size = type_sizeof(member->ty);
+ align = type_alignof(member->ty);
+ }
next_offset = to_aligned(next_offset, align);
next_offset += size;
@@ -734,11 +741,23 @@ int type_offsetof(Type* ty, const char* name) {
for (int i = 0; i < members_of(ty)->as.list->len; ++i) {
AstNode* member = &members_of(ty)->as.list->items[i];
- int size = type_sizeof(member->ty);
- int align = type_alignof(member->ty);
+ int size, align;
+ if (member->as.struct_member->is_bitfield) {
+ // TODO
+ size = member->as.struct_member->bitfield_width / 8;
+ align = 1;
+ } else {
+ size = type_sizeof(member->ty);
+ align = type_alignof(member->ty);
+ }
next_offset = to_aligned(next_offset, align);
if (strcmp(member->as.struct_member->name, name) == 0) {
+ if (member->as.struct_member->is_bitfield) {
+ // C23: 7.21.4
+ // if the specified member is a bit-field, the behavior is undefined.
+ fatal_error("type_offsetof: the result of offsetof(bit-field) is undefined");
+ }
return next_offset;
}
next_offset += size;