]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/40751 (G++ never packs typedef'd enums)
authorJason Merrill <jason@redhat.com>
Thu, 21 Jan 2016 20:26:09 +0000 (15:26 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 21 Jan 2016 20:26:09 +0000 (15:26 -0500)
PR c++/40751
PR c++/64987
* decl.c (copy_type_enum): Respect TYPE_USER_ALIGN.

From-SVN: r232702

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp0x/alignas5.C [new file with mode: 0644]

index f516216ab6f12343e67e20fdc6e7b52f02919440..c592cbf4f729edb887b398cfe38fc20c59d06acb 100644 (file)
@@ -1,5 +1,9 @@
 2016-01-21  Jason Merrill  <jason@redhat.com>
 
+       PR c++/40751
+       PR c++/64987
+       * decl.c (copy_type_enum): Respect TYPE_USER_ALIGN.
+
        PR c++/43407
        * decl.c (start_enum): Add attributes parameter.
        * parser.c (cp_parser_enum_specifier): Pass it.
index d995654a3d8b0b0d0ab2c529bd8c0f29baf3b9ec..020e9bd2510a4b5bd4efddd32240a89d6f33a3c2 100644 (file)
@@ -13030,8 +13030,12 @@ copy_type_enum (tree dst, tree src)
       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (src);
       SET_TYPE_MODE (dst, TYPE_MODE (src));
       TYPE_PRECISION (t) = TYPE_PRECISION (src);
-      TYPE_ALIGN (t) = TYPE_ALIGN (src);
-      TYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (src);
+      unsigned valign = TYPE_ALIGN (src);
+      if (TYPE_USER_ALIGN (t))
+       valign = MAX (valign, TYPE_ALIGN (t));
+      else
+       TYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (src);
+      TYPE_ALIGN (t) = valign;
       TYPE_UNSIGNED (t) = TYPE_UNSIGNED (src);
     }
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/alignas5.C b/gcc/testsuite/g++.dg/cpp0x/alignas5.C
new file mode 100644 (file)
index 0000000..2820ca7
--- /dev/null
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert(X,#X)
+
+enum alignas(16) E {};
+SA(alignof(E) == 16);