diff options
author | Jason Merrill <jason@redhat.com> | 2010-01-20 17:14:51 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-01-20 17:14:51 -0500 |
commit | a402c1b130af88d5f5294dc977ec91dabbe6c388 (patch) | |
tree | 802bce9f55fb35b31fd3f8a8aca0689ec1189ba8 | |
parent | 1f4a7a481f5d76f2932c69f17adffd6bc37add04 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/class.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/packed1.C | 24 |
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 (); +} |