diff options
Diffstat (limited to 'tests/align/talign.nim')
-rw-r--r-- | tests/align/talign.nim | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tests/align/talign.nim b/tests/align/talign.nim new file mode 100644 index 000000000..08373ee49 --- /dev/null +++ b/tests/align/talign.nim @@ -0,0 +1,69 @@ +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()() + |