From: Jason Merrill Date: Wed, 30 Aug 2006 15:51:17 +0000 (-0400) Subject: re PR c++/26670 (attribute((packed)) sometimes not ignored for non-PODs) X-Git-Tag: releases/gcc-4.2.0~1584 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=220020507605be7dd81ade8adbfe866b2005faf9;p=thirdparty%2Fgcc.git re PR c++/26670 (attribute((packed)) sometimes not ignored for non-PODs) PR c++/26670 * class.c (check_field_decls): Don't unset TYPE_PACKED until all the fields have been processed. From-SVN: r116591 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cda27425430a..5311778db8bd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-08-30 Jason Merrill + + PR c++/26670 + * class.c (check_field_decls): Don't unset TYPE_PACKED until all + the fields have been processed. + 2006-08-29 Andrew Pinski PR C++/28349 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 550edffaaab6..7361b5a1ba9b 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2795,6 +2795,7 @@ check_field_decls (tree t, tree *access_decls, tree *next; bool has_pointers; int any_default_members; + int cant_pack = 0; /* Assume there are no access declarations. */ *access_decls = NULL_TREE; @@ -2911,7 +2912,7 @@ check_field_decls (tree t, tree *access_decls, (0, "ignoring packed attribute because of unpacked non-POD field %q+#D", x); - TYPE_PACKED (t) = 0; + cant_pack = 1; } else if (TYPE_ALIGN (TREE_TYPE (x)) > BITS_PER_UNIT) DECL_PACKED (x) = 1; @@ -3018,11 +3019,11 @@ check_field_decls (tree t, tree *access_decls, is needed to free dynamic memory. This seems enough for practical purposes. */ - if (warn_ecpp - && has_pointers - && TYPE_HAS_CONSTRUCTOR (t) - && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) - && !(TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t))) + if (warn_ecpp + && has_pointers + && TYPE_HAS_CONSTRUCTOR (t) + && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) + && !(TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t))) { warning (OPT_Weffc__, "%q#T has pointer data members", t); @@ -3038,6 +3039,9 @@ check_field_decls (tree t, tree *access_decls, " but does not override %", t); } + /* If any of the fields couldn't be packed, unset TYPE_PACKED. */ + if (cant_pack) + TYPE_PACKED (t) = 0; /* Check anonymous struct/anonymous union fields. */ finish_struct_anon (t);