diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-09-15 00:27:16 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-09-15 00:27:16 +0000 |
commit | 29edb15c5637738f3ac9c9d63003303127848204 (patch) | |
tree | 55191847f19102bcfd738acb455adb684fe3adce /gcc/cp | |
parent | bd12da498dc86d4cb18b1f6548d1efb9f530172e (diff) | |
download | gcc-29edb15c5637738f3ac9c9d63003303127848204.zip gcc-29edb15c5637738f3ac9c9d63003303127848204.tar.gz gcc-29edb15c5637738f3ac9c9d63003303127848204.tar.bz2 |
class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for an bit-field whose width exceeds that of its...
* class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for
an bit-field whose width exceeds that of its type.
* g++.dg/abi/bitfield11.C: New test.
* g++.dg/abi/bitfield12.C: Likewise.
From-SVN: r71392
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/class.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 582caf4..706ebbf 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4759,7 +4759,15 @@ layout_class_type (tree t, tree *virtuals_p) field to the size of its declared type; the rest of the field is effectively invisible. */ DECL_SIZE (field) = TYPE_SIZE (type); - DECL_MODE (field) = TYPE_MODE (type); + /* We must also reset the DECL_MODE of the field. */ + if (abi_version_at_least (2)) + DECL_MODE (field) = TYPE_MODE (type); + else if (warn_abi + && DECL_MODE (field) != TYPE_MODE (type)) + /* Versions of G++ before G++ 3.4 did not reset the + DECL_MODE. */ + warning ("the offset of `%D' may not be ABI-compliant and may " + "change in a future version of GCC", field); } else layout_nonempty_base_or_field (rli, field, NULL_TREE, |