commit ffe4b33eeddf614bae1c96533e365b1532ba4f09
parent e9c26a1178422628288faaf3776b2ebbfbe4abe7
Author: m21c <ho*******@gmail.com>
Date: Mon, 20 Apr 2026 23:21:34 +0200
worked on processing record fields
Diffstat:
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);