summary refs log tree commit diff stats
path: root/tests/align/talign.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/align/talign.nim')
-rw-r--r--tests/align/talign.nim69
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()()
+