diff options
author | cooldome <cdome@bk.ru> | 2018-11-26 08:46:19 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-11-26 09:46:19 +0100 |
commit | ea5fc9f2040715788449e9031607eab0a1a4d8e7 (patch) | |
tree | 6a8b1729eb8d647a098507d67c61dc3960e0b6b3 | |
parent | 2ac7f523889a39bf1e4c17af90686e33b9a65883 (diff) | |
download | Nim-ea5fc9f2040715788449e9031607eab0a1a4d8e7.tar.gz |
fixes #9794: sizeof tuple is incorrect if contains imported object (#9795)
* fixes #9794 * Fix linux test
-rw-r--r-- | compiler/sizealignoffsetimpl.nim | 6 | ||||
-rw-r--r-- | tests/types/tfinalobj.nim | 19 |
2 files changed, 21 insertions, 4 deletions
diff --git a/compiler/sizealignoffsetimpl.nim b/compiler/sizealignoffsetimpl.nim index f5ecc04b1..c8da18cf9 100644 --- a/compiler/sizealignoffsetimpl.nim +++ b/compiler/sizealignoffsetimpl.nim @@ -310,9 +310,9 @@ proc computeSizeAlign(conf: ConfigRef; typ: PType) = for i in countup(0, sonsLen(typ) - 1): let child = typ.sons[i] computeSizeAlign(conf, child) - if child.size == szIllegalRecursion: - typ.size = szIllegalRecursion - typ.align = szIllegalRecursion + if child.size < 0: + typ.size = child.size + typ.align = child.align return maxAlign = max(maxAlign, child.align) sizeAccum = align(sizeAccum, child.align) + child.size diff --git a/tests/types/tfinalobj.nim b/tests/types/tfinalobj.nim index 2fda73363..6a1c8c2ce 100644 --- a/tests/types/tfinalobj.nim +++ b/tests/types/tfinalobj.nim @@ -1,5 +1,6 @@ discard """ - output: "abc" + output: '''abc +16 == 16''' """ type @@ -14,3 +15,19 @@ doAssert TA.sizeof == string.sizeof echo a.x +########################################## +# bug #9794 +########################################## +type + imported_double {.importc: "double".} = object + + Pod = object + v* : imported_double + seed*: int32 + + Pod2 = tuple[v: imported_double, seed: int32] + +proc test() = + echo sizeof(Pod), " == ",sizeof(Pod2) + +test() \ No newline at end of file |