aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2003-03-31 15:25:11 -0500
committerJason Merrill <jason@gcc.gnu.org>2003-03-31 15:25:11 -0500
commitadff28c38d207dc3a6007b81380407de0b3def57 (patch)
tree4a8375fa12eae842753474c9b26fb22fd446774f /gcc
parente66833ac07efec1f12f35de6e3694238dd8ff96f (diff)
downloadgcc-adff28c38d207dc3a6007b81380407de0b3def57.zip
gcc-adff28c38d207dc3a6007b81380407de0b3def57.tar.gz
gcc-adff28c38d207dc3a6007b81380407de0b3def57.tar.bz2
re PR java/10145 (java and c++ disagree about class layout)
PR java/10145 * stor-layout.c (update_alignment_for_field): Respect DECL_USER_ALIGN for zero-length bitfields, too. * c-decl.c (finish_struct): Don't set DECL_ALIGN for normal fields. * cp/class.c (check_field_decl): Don't set DECL_ALIGN. From-SVN: r65103
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-decl.c12
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/class.c9
-rw-r--r--gcc/stor-layout.c3
-rw-r--r--gcc/testsuite/gcc.dg/align-1.c24
6 files changed, 39 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 076192b..545b048 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2003-03-31 Jason Merrill <jason@redhat.com>
+
+ PR java/10145
+ * stor-layout.c (update_alignment_for_field): Respect
+ DECL_USER_ALIGN for zero-length bitfields, too.
+ * c-decl.c (finish_struct): Don't set DECL_ALIGN for normal
+ fields.
+
2003-03-31 Matt Austern <austern@apple.com>
* cpppch.c (struct cpp_savedstate): Add defs and n_defs members.
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index d52823b..c9dd711 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -5257,18 +5257,6 @@ finish_struct (t, fieldlist, attributes)
}
}
- else if (TREE_TYPE (x) != error_mark_node)
- {
- unsigned int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT
- : TYPE_ALIGN (TREE_TYPE (x)));
-
- /* Non-bit-fields are aligned for their type, except packed
- fields which require only BITS_PER_UNIT alignment. */
- DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align);
- if (! DECL_PACKED (x))
- DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x));
- }
-
DECL_INITIAL (x) = 0;
/* Detect flexible array member in an invalid context. */
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 93df69d..6eb6d81 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2003-03-31 Jason Merrill <jason@redhat.com>
+
+ PR java/10145
+ * class.c (check_field_decl): Don't set DECL_ALIGN.
+
2003-03-30 Mark Mitchell <mark@codesourcery.com>
PR c++/7647
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index e899c57..01d4dd2 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -3057,15 +3057,6 @@ check_field_decl (tree field,
cp_error_at ("multiple fields in union `%T' initialized");
*any_default_members = 1;
}
-
- /* Non-bit-fields are aligned for their type, except packed fields
- which require only BITS_PER_UNIT alignment. */
- DECL_ALIGN (field) = MAX (DECL_ALIGN (field),
- (DECL_PACKED (field)
- ? BITS_PER_UNIT
- : TYPE_ALIGN (TREE_TYPE (field))));
- if (! DECL_PACKED (field))
- DECL_USER_ALIGN (field) |= TYPE_USER_ALIGN (TREE_TYPE (field));
}
/* Check the data members (both static and non-static), class-scoped
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 6caaf5f..af02cad 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -746,7 +746,8 @@ update_alignment_for_field (rli, field, known_align)
{
/* A zero-length bit-field affects the alignment of the next
field. */
- if (!DECL_PACKED (field) && integer_zerop (DECL_SIZE (field)))
+ if (!DECL_PACKED (field) && !user_align
+ && integer_zerop (DECL_SIZE (field)))
{
desired_align = TYPE_ALIGN (type);
#ifdef ADJUST_FIELD_ALIGN
diff --git a/gcc/testsuite/gcc.dg/align-1.c b/gcc/testsuite/gcc.dg/align-1.c
new file mode 100644
index 0000000..cb6dcab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/align-1.c
@@ -0,0 +1,24 @@
+// PR java/10145
+// Test that requesting an alignment of 1 does not increase the alignment
+// of a long long field.
+
+// { dg-do run }
+
+struct A
+{
+ char c;
+ long long i;
+};
+
+struct B
+{
+ char c;
+ long long i __attribute ((__aligned__ (1)));
+};
+
+int main ()
+{
+ if (sizeof (struct A) != sizeof (struct B))
+ abort ();
+ return 0;
+}