From 3af7818af4bb541e24146fa8f8334cf7c0b53128 Mon Sep 17 00:00:00 2001 From: cooldome Date: Thu, 5 Nov 2020 17:55:52 +0000 Subject: [PATCH] Fix #12636 (#15850) * close #11142 * fix #12636 * undo unwanted changes * fix illegal recursion case --- compiler/sizealignoffsetimpl.nim | 8 ++++++-- tests/misc/tsizeof.nim | 14 +++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/compiler/sizealignoffsetimpl.nim b/compiler/sizealignoffsetimpl.nim index 2c764fe12ae72..b50777c9e8069 100644 --- a/compiler/sizealignoffsetimpl.nim +++ b/compiler/sizealignoffsetimpl.nim @@ -258,12 +258,16 @@ proc computeSizeAlign(conf: ConfigRef; typ: PType) = of tyArray: computeSizeAlign(conf, typ[1]) - let elemSize = typ[1].size + let elemSize = typ[1].size + let len = lengthOrd(conf, typ[0]) if elemSize < 0: typ.size = elemSize typ.align = int16(elemSize) + elif len < 0: + typ.size = szUnknownSize + typ.align = szUnknownSize else: - typ.size = toInt64Checked(lengthOrd(conf, typ[0]) * int32(elemSize), szTooBigSize) + typ.size = toInt64Checked(len * int32(elemSize), szTooBigSize) typ.align = typ[1].align of tyUncheckedArray: diff --git a/tests/misc/tsizeof.nim b/tests/misc/tsizeof.nim index a09265667b9a0..0d96a5e04f6c9 100644 --- a/tests/misc/tsizeof.nim +++ b/tests/misc/tsizeof.nim @@ -361,6 +361,16 @@ testinstance: y: int32 z: AnotherEnum + Stack[N: static int, T: object] = object + pad: array[128 - sizeof(array[N, ptr T]) - sizeof(int) - sizeof(pointer), byte] + stack: array[N, ptr T] + len*: int + rawMem: ptr array[N, T] + + Stack2[T: object] = object + pad: array[128 - sizeof(array[sizeof(T), ptr T]), byte] + + const trivialSize = sizeof(TrivialType) # needs to be able to evaluate at compile time proc main(): void = @@ -377,6 +387,8 @@ testinstance: var po : PaddingOfSetEnum33 var capo: MyCustomAlignPackedObject var issue15516: MyObject + var issue12636_1: Stack[5, MyObject] + var issue12636_2: Stack2[MyObject] var e1: Enum1 @@ -395,7 +407,7 @@ testinstance: else: doAssert sizeof(SimpleAlignment) > 10 - testSizeAlignOf(t,a,b,c,d,e,f,g,ro,go,po, e1, e2, e4, e8, eoa, eob, capo, issue15516) + testSizeAlignOf(t,a,b,c,d,e,f,g,ro,go,po, e1, e2, e4, e8, eoa, eob, capo, issue15516, issue12636_1, issue12636_2) type WithBitsize {.objectconfig.} = object