aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-09-15 00:27:16 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-09-15 00:27:16 +0000
commit29edb15c5637738f3ac9c9d63003303127848204 (patch)
tree55191847f19102bcfd738acb455adb684fe3adce /gcc
parentbd12da498dc86d4cb18b1f6548d1efb9f530172e (diff)
downloadgcc-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')
-rw-r--r--gcc/cp/class.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield11.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield12.C5
4 files changed, 33 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,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9d7c8e5..802d53e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-09-14 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/abi/bitfield11.C: New test.
+ * g++.dg/abi/bitfield12.C: Likewise.
+
2003-09-14 Alexandre Oliva <aoliva@redhat.com>
* gcc.dg/cpp/separate-1.c: Adjust line of error. Test for correct
diff --git a/gcc/testsuite/g++.dg/abi/bitfield11.C b/gcc/testsuite/g++.dg/abi/bitfield11.C
new file mode 100644
index 0000000..e78ea12
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield11.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-w -fabi-version=0" }
+
+struct S {
+ char c : 1024;
+};
+
+S s;
+
+int main () {
+ s.c = 1;
+ if (*(char *)&s != 1)
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/abi/bitfield12.C b/gcc/testsuite/g++.dg/abi/bitfield12.C
new file mode 100644
index 0000000..6cfda5d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield12.C
@@ -0,0 +1,5 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+struct S { // { dg-warning "ABI" }
+ char c : 1024; // { dg-warning "width" }
+};