re PR c++/26670 (attribute((packed)) sometimes not ignored for non-PODs)

PR c++/26670
        * class.c (check_field_decls): Unset TYPE_PACKED (t) if one of the
        fields can't be packed.

From-SVN: r116555
This commit is contained in:
Jason Merrill 2006-08-29 02:55:35 -04:00
parent bed02d8960
commit 4666cd0446
2 changed files with 20 additions and 4 deletions

View File

@ -2906,10 +2906,13 @@ check_field_decls (tree t, tree *access_decls,
if (TYPE_PACKED (t))
{
if (!pod_type_p (type) && !TYPE_PACKED (type))
warning
(0,
"ignoring packed attribute on unpacked non-POD field %q+#D",
x);
{
warning
(0,
"ignoring packed attribute because of unpacked non-POD field %q+#D",
x);
TYPE_PACKED (t) = 0;
}
else if (TYPE_ALIGN (TREE_TYPE (x)) > BITS_PER_UNIT)
DECL_PACKED (x) = 1;
}

View File

@ -0,0 +1,13 @@
// PR c++/26670
struct nonpod {
nonpod();
};
struct nonpod_pack {
nonpod n; // { dg-warning "ignoring packed attribute" }
} __attribute__ ((packed));
struct nonpod_pack2 {
nonpod_pack p; // { dg-warning "ignoring packed attribute" }
} __attribute__ ((packed));