From 38bc469be7f1a05404ff295bacf862a71d8bf9ba Mon Sep 17 00:00:00 2001 From: dimgigov Date: Mon, 8 Jun 2026 18:48:30 +0300 Subject: [PATCH] fix(bootstrap): resolve algebraic enum _Data union field types in HIR lowering hir_lower.resolveExprType for ekField now correctly resolves variant positional/named fields (e.g., r.data.Ok_0, r.data.Err_0) on _Data union types, matching the existing logic in sema.checkExpr. This fixes the runtime segfault in examples/algebraic_enums.bux where the C backend emitted an int temporary for a String field, causing PrintLine to dereference a garbage pointer. --- bootstrap/hir_lower.nim | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/bootstrap/hir_lower.nim b/bootstrap/hir_lower.nim index 600411a..dbd0de2 100644 --- a/bootstrap/hir_lower.nim +++ b/bootstrap/hir_lower.nim @@ -352,6 +352,19 @@ proc resolveExprType(ctx: var LowerCtx, expr: Expr): Type = if objType.isPointer and objType.inner.len > 0: objType = objType.inner[0] if objType.kind == tkNamed: + # Check if this is a _Data union field access + if objType.name.endsWith("_Data"): + let enumName = objType.name[0..^6] + let enumSym = ctx.globalScope.lookup(enumName) + if enumSym != nil and enumSym.decl != nil and enumSym.decl.kind == dkEnum: + for variant in enumSym.decl.declEnumVariants: + for i, f in variant.fields: + let fieldName = variant.name & "_" & $i + if fieldName == expr.exprFieldName: + return ctx.resolveTypeExpr(f) + for nf in variant.namedFields: + if nf.name == expr.exprFieldName: + return ctx.resolveTypeExpr(nf.ftype) var sym = ctx.globalScope.lookup(objType.name) var decl = if sym != nil: sym.decl else: nil # If the type is a monomorphized generic struct instance, look up the base