parent
3b901d1e36
commit
fe187719ab
2 changed files with 23 additions and 5 deletions
|
|
@ -138,12 +138,13 @@ proc computeObjectOffsetsFoldFunction(conf: ConfigRef; n: PNode, packed: bool, a
|
||||||
accum.offset = szUnknownSize
|
accum.offset = szUnknownSize
|
||||||
accum.maxAlign = szUnknownSize
|
accum.maxAlign = szUnknownSize
|
||||||
else:
|
else:
|
||||||
# the union neds to be aligned first, before the offsets can be assigned
|
# the union needs to be aligned first, before the offsets can be assigned
|
||||||
accum.align(maxChildAlign)
|
accum.align(maxChildAlign)
|
||||||
let accumRoot = accum # copy, because each branch should start af the same offset
|
let accumRoot = accum # copy, because each branch should start af the same offset
|
||||||
for i in 1..<n.len:
|
for i in 1..<n.len:
|
||||||
var branchAccum = accumRoot
|
var branchAccum = OffsetAccum(offset: accumRoot.offset, maxAlign: 1)
|
||||||
computeObjectOffsetsFoldFunction(conf, n[i].lastSon, packed, branchAccum)
|
computeObjectOffsetsFoldFunction(conf, n[i].lastSon, packed, branchAccum)
|
||||||
|
discard finish(branchAccum)
|
||||||
accum.mergeBranch(branchAccum)
|
accum.mergeBranch(branchAccum)
|
||||||
of nkRecList:
|
of nkRecList:
|
||||||
for i, child in n.sons:
|
for i, child in n.sons:
|
||||||
|
|
@ -173,9 +174,10 @@ proc computeUnionObjectOffsetsFoldFunction(conf: ConfigRef; n: PNode; packed: bo
|
||||||
localError(conf, n.info, "Illegal use of ``case`` in union type.")
|
localError(conf, n.info, "Illegal use of ``case`` in union type.")
|
||||||
of nkRecList:
|
of nkRecList:
|
||||||
let accumRoot = accum # copy, because each branch should start af the same offset
|
let accumRoot = accum # copy, because each branch should start af the same offset
|
||||||
for i, child in n.sons:
|
for child in n.sons:
|
||||||
var branchAccum = accumRoot
|
var branchAccum = OffsetAccum(offset: accumRoot.offset, maxAlign: 1)
|
||||||
computeUnionObjectOffsetsFoldFunction(conf, child, packed, branchAccum)
|
computeUnionObjectOffsetsFoldFunction(conf, child, packed, branchAccum)
|
||||||
|
discard finish(branchAccum)
|
||||||
accum.mergeBranch(branchAccum)
|
accum.mergeBranch(branchAccum)
|
||||||
of nkSym:
|
of nkSym:
|
||||||
var size = szUnknownSize
|
var size = szUnknownSize
|
||||||
|
|
|
||||||
|
|
@ -346,6 +346,21 @@ testinstance:
|
||||||
c: char
|
c: char
|
||||||
d: int32 # unaligned
|
d: int32 # unaligned
|
||||||
|
|
||||||
|
Kind = enum
|
||||||
|
K1, K2
|
||||||
|
|
||||||
|
AnotherEnum = enum
|
||||||
|
X1, X2, X3
|
||||||
|
|
||||||
|
MyObject = object
|
||||||
|
s: string
|
||||||
|
case k: Kind
|
||||||
|
of K1: nil
|
||||||
|
of K2:
|
||||||
|
x: float
|
||||||
|
y: int32
|
||||||
|
z: AnotherEnum
|
||||||
|
|
||||||
const trivialSize = sizeof(TrivialType) # needs to be able to evaluate at compile time
|
const trivialSize = sizeof(TrivialType) # needs to be able to evaluate at compile time
|
||||||
|
|
||||||
proc main(): void =
|
proc main(): void =
|
||||||
|
|
@ -361,6 +376,7 @@ testinstance:
|
||||||
var go : GenericObject[int64]
|
var go : GenericObject[int64]
|
||||||
var po : PaddingOfSetEnum33
|
var po : PaddingOfSetEnum33
|
||||||
var capo: MyCustomAlignPackedObject
|
var capo: MyCustomAlignPackedObject
|
||||||
|
var issue15516: MyObject
|
||||||
|
|
||||||
var
|
var
|
||||||
e1: Enum1
|
e1: Enum1
|
||||||
|
|
@ -379,7 +395,7 @@ testinstance:
|
||||||
else:
|
else:
|
||||||
doAssert sizeof(SimpleAlignment) > 10
|
doAssert sizeof(SimpleAlignment) > 10
|
||||||
|
|
||||||
testSizeAlignOf(t,a,b,c,d,e,f,g,ro,go,po, e1, e2, e4, e8, eoa, eob, capo)
|
testSizeAlignOf(t,a,b,c,d,e,f,g,ro,go,po, e1, e2, e4, e8, eoa, eob, capo, issue15516)
|
||||||
|
|
||||||
type
|
type
|
||||||
WithBitsize {.objectconfig.} = object
|
WithBitsize {.objectconfig.} = object
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue