diff options
author | Araq <rumpf_a@web.de> | 2018-12-05 16:16:58 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2018-12-05 16:16:58 +0100 |
commit | 1711a60f7b3968285bb753b2e98bfc4638d32a44 (patch) | |
tree | 1556e0e5d2d324fbdfaae3c9158f361c36ece5e2 | |
parent | 9eaf99f7e61d07f5502b3656a255ea944c47f984 (diff) | |
download | Nim-1711a60f7b3968285bb753b2e98bfc4638d32a44.tar.gz |
fixes #9868
-rw-r--r-- | compiler/semexprs.nim | 17 | ||||
-rw-r--r-- | compiler/sizealignoffsetimpl.nim | 3 | ||||
-rw-r--r-- | tests/misc/tsizeof2.nim | 4 |
3 files changed, 23 insertions, 1 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 623af9784..08917cb29 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1975,6 +1975,22 @@ proc setMs(n: PNode, s: PSym): PNode = n.sons[0] = newSymNode(s) n.sons[0].info = n.info +proc semSizeof(c: PContext, n: PNode): PNode = + if sonsLen(n) != 2: + localError(c.config, n.info, errXExpectsTypeOrValue % "sizeof") + else: + n.sons[1] = semExprWithType(c, n.sons[1], {efDetermineType}) + #restoreOldStyleType(n.sons[1]) + n.typ = getSysType(c.graph, n.info, tyInt) + + let size = getSize(c.config, n[1].typ) + if size >= 0: + result = newIntNode(nkIntLit, size) + result.info = n.info + result.typ = n.typ + else: + result = n + proc semMagic(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode = # this is a hotspot in the compiler! result = n @@ -2060,6 +2076,7 @@ proc semMagic(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode = result = setMs(n, s) else: result = c.graph.emptyNode + of mSizeOf: result = semSizeof(c, setMs(n, s)) of mOmpParFor: checkMinSonsLen(n, 3, c.config) result = semDirectOp(c, n, flags) diff --git a/compiler/sizealignoffsetimpl.nim b/compiler/sizealignoffsetimpl.nim index 2f50a99f6..a34383d9f 100644 --- a/compiler/sizealignoffsetimpl.nim +++ b/compiler/sizealignoffsetimpl.nim @@ -52,6 +52,7 @@ proc computeSubObjectAlign(conf: ConfigRef; n: PNode): BiggestInt = proc computeObjectOffsetsFoldFunction(conf: ConfigRef; n: PNode, initialOffset: BiggestInt): tuple[offset, align: BiggestInt] = ## ``offset`` is the offset within the object, after the node has been written, no padding bytes added ## ``align`` maximum alignment from all sub nodes + assert n != nil if n.typ != nil and n.typ.size == szIllegalRecursion: result.offset = szIllegalRecursion result.align = szIllegalRecursion @@ -177,7 +178,7 @@ proc computePackedObjectOffsetsFoldFunction(conf: ConfigRef; n: PNode, initialOf proc computeSizeAlign(conf: ConfigRef; typ: PType) = ## computes and sets ``size`` and ``align`` members of ``typ`` - + assert typ != nil let hasSize = typ.size != szUncomputedSize let hasAlign = typ.align != szUncomputedSize diff --git a/tests/misc/tsizeof2.nim b/tests/misc/tsizeof2.nim index 67379871d..4252142d7 100644 --- a/tests/misc/tsizeof2.nim +++ b/tests/misc/tsizeof2.nim @@ -9,3 +9,7 @@ type const i = sizeof(MyStruct) echo i + +# bug #9868 +proc foo(a: SomeInteger): array[sizeof(a), byte] = + discard |