aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-01-20 17:14:51 -0500
committerJason Merrill <jason@gcc.gnu.org>2010-01-20 17:14:51 -0500
commita402c1b130af88d5f5294dc977ec91dabbe6c388 (patch)
tree802bce9f55fb35b31fd3f8a8aca0689ec1189ba8
parent1f4a7a481f5d76f2932c69f17adffd6bc37add04 (diff)
downloadgcc-a402c1b130af88d5f5294dc977ec91dabbe6c388.zip
gcc-a402c1b130af88d5f5294dc977ec91dabbe6c388.tar.gz
gcc-a402c1b130af88d5f5294dc977ec91dabbe6c388.tar.bz2
re PR c++/41788 (-Wpacked option changes the layout of packed non-POD structs)
PR c++/41788 * class.c (layout_class_type): Set packed_maybe_necessary for packed non-PODs. From-SVN: r156088
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/class.c5
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/abi/packed1.C24
4 files changed, 36 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 828f4b0..4cc1119 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2010-01-20 Jason Merrill <jason@redhat.com>
+ PR c++/41788
+ * class.c (layout_class_type): Set packed_maybe_necessary for packed
+ non-PODs.
+
PR c++/41920
* semantics.c (build_lambda_object): Call mark_used on captured
variables.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 16d5666..f88914d 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -5216,6 +5216,11 @@ layout_class_type (tree t, tree *virtuals_p)
build_decl (input_location,
FIELD_DECL, NULL_TREE, char_type_node));
+ /* If this is a non-POD, declaring it packed makes a difference to how it
+ can be used as a field; don't let finalize_record_size undo it. */
+ if (TYPE_PACKED (t) && !layout_pod_type_p (t))
+ rli->packed_maybe_necessary = true;
+
/* Let the back end lay out the type. */
finish_record_layout (rli, /*free_p=*/true);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 99c5614..a3bf6c9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2010-01-20 Jason Merrill <jason@redhat.com>
+ PR c++/41788
+ * g++.dg/abi/packed1.C: New.
+
PR c++/41920
* g++.dg/cpp0x/lambda/lambda-warn1.C: New.
diff --git a/gcc/testsuite/g++.dg/abi/packed1.C b/gcc/testsuite/g++.dg/abi/packed1.C
new file mode 100644
index 0000000..4e75972
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/packed1.C
@@ -0,0 +1,24 @@
+// PR c++/41788
+// { dg-options "-Wpacked" }
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct INNER {
+ virtual int foo() const { return 1; }
+} __attribute__ ((packed));
+
+struct OUTER {
+ char c;
+ INNER inner;
+} __attribute__ ((packed));
+
+int main()
+{
+ OUTER outer;
+ int s = sizeof(outer);
+ int o = (char *)&outer.inner - (char *)&outer;
+ if (s != sizeof (char) + sizeof (void*)
+ || o != sizeof (char))
+ abort ();
+}