summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ast.nim4
-rw-r--r--compiler/pragmas.nim6
-rw-r--r--tests/align/globalalignas.nim (renamed from tests/misc/globalalignas.nim)0
-rw-r--r--tests/align/talign.nim (renamed from tests/misc/talignas.nim)15
-rw-r--r--tests/align/tillegalalign.nim (renamed from tests/misc/tillegalalignas.nim)2
5 files changed, 18 insertions, 9 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 99733ef3f..2cdf40a8f 100644
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -826,7 +826,7 @@ type
     of skLet, skVar, skField, skForVar:
       guard*: PSym
       bitsize*: int
-      alignment*: int # for alignas(X) expressions
+      alignment*: int # for alignment
     else: nil
     magic*: TMagic
     typ*: PType
@@ -1398,6 +1398,8 @@ proc copySym*(s: PSym): PSym =
   result.annex = s.annex      # BUGFIX
   if result.kind in {skVar, skLet, skField}:
     result.guard = s.guard
+    result.bitsize = s.bitsize
+    result.alignment = s.alignment
 
 proc createModuleAlias*(s: PSym, newIdent: PIdent, info: TLineInfo;
                         options: TOptions): PSym =
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index 1802493f4..0004fe94b 100644
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -819,12 +819,10 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: var int,
           localError(c.config, it.info, "size may only be 1, 2, 4 or 8")
       of wAlign:
         let alignment = expectIntLit(c, it)
-        if alignment == 0:
-          discard
-        elif isPowerOfTwo(alignment):
+        if isPowerOfTwo(alignment) and alignment > 0:
           sym.alignment = max(sym.alignment, alignment)
         else:
-          localError(c.config, it.info, "power of two or 0 expected")
+          localError(c.config, it.info, "power of two expected")
       of wNodecl:
         noVal(c, it)
         incl(sym.loc.flags, lfNoDecl)
diff --git a/tests/misc/globalalignas.nim b/tests/align/globalalignas.nim
index 15f564733..15f564733 100644
--- a/tests/misc/globalalignas.nim
+++ b/tests/align/globalalignas.nim
diff --git a/tests/misc/talignas.nim b/tests/align/talign.nim
index 5d5250309..e0503cc70 100644
--- a/tests/misc/talignas.nim
+++ b/tests/align/talign.nim
@@ -31,9 +31,9 @@ proc foobar() =
   doAssert (cast[uint](addr(toplevel3)) and 31) == 0
 
   # test multiple align expressions
-  var mylocal1 {.align(0), align(128), align(32).}: int = 123
-  var mylocal2 {.align(128), align(0), align(32).}: int = 123
-  var mylocal3 {.align(0), align(32), align(128).}: int = 123
+  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
@@ -42,3 +42,12 @@ proc foobar() =
   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
diff --git a/tests/misc/tillegalalignas.nim b/tests/align/tillegalalign.nim
index 56721f2ea..c4a95f11b 100644
--- a/tests/misc/tillegalalignas.nim
+++ b/tests/align/tillegalalign.nim
@@ -1,6 +1,6 @@
 discard """
 cmd: "nim check $options $file"
-errormsg: "power of two or 0 expected"
+errormsg: "power of two expected"
 """
 
 proc foobar() =