Aria

A low-level systems programming language
git clone git://git.m21c.me/Aria.git
Log | Files | Refs | LICENSE

commit ffe4b33eeddf614bae1c96533e365b1532ba4f09
parent e9c26a1178422628288faaf3776b2ebbfbe4abe7
Author: m21c <ho*******@gmail.com>
Date:   Mon, 20 Apr 2026 23:21:34 +0200

worked on processing record fields

Diffstat:
Mcompiler.c | 14+++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/compiler.c b/compiler.c @@ -3210,8 +3210,10 @@ extractfields(Record *record, Node *recordscope) static void calculatefields(Record *record, Type *recordtype) { + const bool isunion = record->isunion; Field *field; + /* @todo calculate size/align for unions */ for (field = record->head; field; field = field->next) { size_t mod = 0, padding; Type *type; @@ -3221,6 +3223,12 @@ calculatefields(Record *record, Type *recordtype) if (recordtype->align < type->align) recordtype->align = type->align; + if (isunion) { + if (recordtype->size < type->size) + recordtype->size = type->size; + continue; + } + if (recordtype->align) mod = recordtype->size % recordtype->align; @@ -5871,6 +5879,7 @@ advance: break; case KSTRUCT: + case KUNION: assert(expr->rhs); extractnfs(env, expr->rhs); break; @@ -6746,10 +6755,13 @@ codegen(CodeGen *cg, Node *expr) codegen(cg, expr->rhs); --cg->commacount; break; - case KSTRUCT: case KUNION: + cgprintf(cg, "union "); + goto joinstruct; + case KSTRUCT: cgprintf(cg, "struct "); + joinstruct: assert(expr->type); if (expr->type->module) cgdeclname(cg, expr->type->module);