aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-01-21 15:26:09 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-01-21 15:26:09 -0500
commit2f3932b910c7e450e0ac75e607dfb7229b9429cc (patch)
tree108d2774d7fb373ff3da1675d088df1d8f457698
parent97ca3d0d59208beb76920dcfe33aeb921e396042 (diff)
downloadgcc-2f3932b910c7e450e0ac75e607dfb7229b9429cc.zip
gcc-2f3932b910c7e450e0ac75e607dfb7229b9429cc.tar.gz
gcc-2f3932b910c7e450e0ac75e607dfb7229b9429cc.tar.bz2
re PR c++/40751 (G++ never packs typedef'd enums)
PR c++/40751 PR c++/64987 * decl.c (copy_type_enum): Respect TYPE_USER_ALIGN. From-SVN: r232702
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl.c8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alignas5.C6
3 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f516216..c592cbf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d995654..020e9bd 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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
index 0000000..2820ca7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alignas5.C
@@ -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);