From 20d0ef8afbd4b7b74c24f069841cce52cd5beaff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Wed, 3 Jul 2019 08:00:40 +0200 Subject: [PATCH] [backport] fix #11320 (#11538) * [backport] fix #11320 * fix test for 32 bit test --- compiler/sizealignoffsetimpl.nim | 2 +- lib/system.nim | 4 ++-- tests/errmsgs/tuncheckedarrayvar.nim | 4 +--- tests/misc/tsizeof.nim | 13 +++++++++++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/compiler/sizealignoffsetimpl.nim b/compiler/sizealignoffsetimpl.nim index 66fb3dc5b1..cf8f296b40 100644 --- a/compiler/sizealignoffsetimpl.nim +++ b/compiler/sizealignoffsetimpl.nim @@ -291,7 +291,7 @@ proc computeSizeAlign(conf: ConfigRef; typ: PType) = of tyUncheckedArray: let base = typ.lastSon computeSizeAlign(conf, base) - typ.size = szUnknownSize + typ.size = 0 typ.align = base.align of tyEnum: if firstOrd(conf, typ) < 0: diff --git a/lib/system.nim b/lib/system.nim index 256410522f..d0149a1184 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -877,8 +877,8 @@ when defined(nimHasalignOf): proc offsetOfDotExpr(typeAccess: typed): int {.magic: "OffsetOf", noSideEffect, compileTime.} template offsetOf*[T](t: typedesc[T]; member: untyped): int = - var tmp: T - offsetOfDotExpr(tmp.member) + var tmp {.noinit.}: ptr T + offsetOfDotExpr(tmp[].member) template offsetOf*[T](value: T; member: untyped): int = offsetOfDotExpr(value.member) diff --git a/tests/errmsgs/tuncheckedarrayvar.nim b/tests/errmsgs/tuncheckedarrayvar.nim index 17965914a9..9376a01505 100644 --- a/tests/errmsgs/tuncheckedarrayvar.nim +++ b/tests/errmsgs/tuncheckedarrayvar.nim @@ -4,6 +4,4 @@ invalid type: 'UncheckedArray[uint8]' for var ''' """ -var - rawMem = alloc0(20) - byteUA = cast[UncheckedArray[uint8]](rawMem) +var byteUA: UncheckedArray[uint8] diff --git a/tests/misc/tsizeof.nim b/tests/misc/tsizeof.nim index 50d1c645a1..f3d946a564 100644 --- a/tests/misc/tsizeof.nim +++ b/tests/misc/tsizeof.nim @@ -536,3 +536,16 @@ proc main() = typeProcessing(mylocal) main() + +# issue #11320 use UncheckedArray + +type + Payload = object + something: int8 + vals: UncheckedArray[int32] + +proc payloadCheck() = + doAssert offsetOf(Payload, vals) == 4 + doAssert sizeOf(Payload) == 4 + +payloadCheck()