mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
* fixes #22419; async/closure environment does not align local variables * Apply suggestions from code review * Update tests/align/talign.nim Co-authored-by: Jacek Sieka <arnetheduck@gmail.com> * apply code review * update tests --------- Co-authored-by: Jacek Sieka <arnetheduck@gmail.com>
70 lines
1.8 KiB
Nim
70 lines
1.8 KiB
Nim
discard """
|
|
ccodeCheck: "\\i @'NIM_ALIGN(128) NI mylocal1' .*"
|
|
targets: "c cpp"
|
|
output: "align ok"
|
|
"""
|
|
|
|
# This is for Azure. The keyword ``alignof`` only exists in ``c++11``
|
|
# and newer. On Azure gcc does not default to c++11 yet.
|
|
|
|
import globalalignas
|
|
|
|
var toplevel1 {.align: 32.} : int32
|
|
var toplevel2 {.align: 32.} : int32
|
|
var toplevel3 {.align: 32.} : int32
|
|
|
|
proc foobar() =
|
|
var myvar1 {.global, align(64).}: int = 123
|
|
var myvar2 {.global, align(64).}: int = 123
|
|
var myvar3 {.global, align(64).}: int = 123
|
|
|
|
doAssert (cast[uint](addr(myglobal1)) and 127) == 0
|
|
doAssert (cast[uint](addr(myglobal2)) and 127) == 0
|
|
doAssert (cast[uint](addr(myglobal3)) and 127) == 0
|
|
|
|
doAssert (cast[uint](addr(myvar1)) and 63) == 0
|
|
doAssert (cast[uint](addr(myvar2)) and 63) == 0
|
|
doAssert (cast[uint](addr(myvar3)) and 63) == 0
|
|
|
|
doAssert (cast[uint](addr(toplevel1)) and 31) == 0
|
|
doAssert (cast[uint](addr(toplevel2)) and 31) == 0
|
|
doAssert (cast[uint](addr(toplevel3)) and 31) == 0
|
|
|
|
# test multiple align expressions
|
|
var mylocal1 {.align(128), align(32).}: int = 123
|
|
var mylocal2 {.align(128), align(32).}: int = 123
|
|
var mylocal3 {.align(32), align(128).}: int = 123
|
|
|
|
doAssert (cast[uint](addr(mylocal1)) and 127) == 0
|
|
doAssert (cast[uint](addr(mylocal2)) and 127) == 0
|
|
doAssert (cast[uint](addr(mylocal3)) and 127) == 0
|
|
|
|
echo "align ok"
|
|
|
|
foobar()
|
|
|
|
# bug #13122
|
|
|
|
type Bug[T] = object
|
|
bug{.align:64.}: T
|
|
sideffect{.align:64.}: int
|
|
|
|
var bug: Bug[int]
|
|
doAssert sizeof(bug) == 128, "Oops my size is " & $sizeof(bug) # 16
|
|
|
|
|
|
block: # bug #22419
|
|
type
|
|
ValidatorPubKey = object
|
|
blob: array[96, byte]
|
|
|
|
proc f(): auto =
|
|
return iterator() =
|
|
var pad: int8 = 0
|
|
var y {.align: 16.}: ValidatorPubKey
|
|
let value = cast[uint64](addr y)
|
|
doAssert value mod 16 == 0
|
|
|
|
f()()
|
|
|