This commit is contained in:
cooldome 2020-10-08 08:12:03 +01:00 • committed by GitHub
commit fe187719ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 5 deletions

View file

@ -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

View file

@ -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