diff options
-rw-r--r-- | compiler/ccgexprs.nim | 4 | ||||
-rw-r--r-- | compiler/ccgtypes.nim | 6 |
2 files changed, 9 insertions, 1 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 4fef41228..ba4c6f485 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -718,6 +718,8 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) = a: TLoc i: int initLocExpr(p, e.sons[0], a) + let tupType = a.t.skipTypes(abstractInst) + assert tupType.kind == tyTuple d.inheritLocation(a) discard getTypeDesc(p.module, a.t) # fill the record's fields.loc var r = rdLoc(a) @@ -725,7 +727,7 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) = of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal) else: internalError(e.info, "genTupleElem") addf(r, ".Field$1", [rope(i)]) - putIntoDest(p, d, a.t.sons[i], r, a.s) + putIntoDest(p, d, tupType.sons[i], r, a.s) proc lookupFieldAgain(p: BProc, ty: PType; field: PSym; r: var Rope): PSym = var ty = ty diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index c77cbe284..0bb700f1c 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -916,6 +916,9 @@ proc genObjectFields(m: BModule, typ, origType: PType, n: PNode, expr: Rope) = var tmp = discriminatorTableName(m, typ, field) var L = lengthOrd(field.typ) assert L > 0 + if field.loc.r == nil: fillObjectFields(m, typ) + if field.loc.t == nil: + internalError(n.info, "genObjectFields") addf(m.s[cfsTypeInit3], "$1.kind = 3;$n" & "$1.offset = offsetof($2, $3);$n" & "$1.typ = $4;$n" & "$1.name = $5;$n" & "$1.sons = &$6[0];$n" & @@ -949,6 +952,9 @@ proc genObjectFields(m: BModule, typ, origType: PType, n: PNode, expr: Rope) = of nkSym: var field = n.sym if field.bitsize == 0: + if field.loc.r == nil: fillObjectFields(m, typ) + if field.loc.t == nil: + internalError(n.info, "genObjectFields") addf(m.s[cfsTypeInit3], "$1.kind = 1;$n" & "$1.offset = offsetof($2, $3);$n" & "$1.typ = $4;$n" & "$1.name = $5;$n", [expr, getTypeDesc(m, origType), |