From 29edb15c5637738f3ac9c9d63003303127848204 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 15 Sep 2003 00:27:16 +0000 Subject: [PATCH] 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 --- gcc/cp/class.c | 10 +++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/abi/bitfield11.C | 14 ++++++++++++++ gcc/testsuite/g++.dg/abi/bitfield12.C | 5 +++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/abi/bitfield11.C create mode 100644 gcc/testsuite/g++.dg/abi/bitfield12.C diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 582caf4279ed..706ebbff6782 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 9d7c8e5547a7..802d53e4a3cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-09-14 Mark Mitchell + + * g++.dg/abi/bitfield11.C: New test. + * g++.dg/abi/bitfield12.C: Likewise. + 2003-09-14 Alexandre Oliva * 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 000000000000..e78ea121d615 --- /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 000000000000..6cfda5d47df5 --- /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" } +};