Files
Nim/tests/align/talign.nim
2026-01-26 18:37:38 +08:00

90 lines
2.1 KiB
Nim

discard """
ccodeCheck: "\\i @'NIM_ALIGN(128) NI mylocal1' .*"
matrix: "--mm:refc; --mm:orc"
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()()
type Xxx = object
v {.align: 128.}: byte
type Yyy = object
v: byte
v2: Xxx
for i in 0..<3:
let x = new Yyy
# echo "addr v2.v:", cast[uint](addr x.v2.v)
doAssert cast[uint](addr x.v2.v) mod 128 == 0
let m = new Yyy
m.v2.v = 42
doAssert m.v2.v == 42
m.v = 7
doAssert m.v == 7