diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-03-15 12:35:04 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-02 18:30:18 +0900 |
| commit | 76654319325efadf9ef19f4ce181397ad53f6914 (patch) | |
| tree | 9600fb99a9ac71766a9f5c9fd0b95541e39a34e7 /src/ast.c | |
| parent | 2e308aca586b243b96c8e6c817f748d551cf7468 (diff) | |
| download | ducc-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.c | 27 |
1 files changed, 23 insertions, 4 deletions
@@ -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; |
