re PR middle-end/23467 (alignment of member doesn't always carry over to alignment...
authorJ"orn Rennecke <joern.rennecke@st.com>
Tue, 23 Aug 2005 12:27:53 +0000 (12:27 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Tue, 23 Aug 2005 12:27:53 +0000 (13:27 +0100)
gcc:
        PR middle-end/23467
        * stor-layout.c (finalize_type_size): Dont override
        existing alignment with a smaller alignment from the mode.
testsuite:
        PR middle-end/23467
        * gcc.c-torture/execute/pr23467.c: New test.

From-SVN: r103394

gcc/ChangeLog
gcc/stor-layout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr23467.c [new file with mode: 0644]

index a9275fa..407f6f5 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-23  J"orn Rennecke <joern.rennecke@st.com>
+
+       PR middle-end/23467
+       * stor-layout.c (finalize_type_size): Dont override
+       existing alignment with a smaller alignment from the mode.
+
 2005-08-23  Sebastian Pop  <pop@cri.ensmp.fr>
 
        * lambda-code.c (lambda_vector_lexico_pos): Moved...
index 321a4d2..0ec818d 100644 (file)
@@ -1407,8 +1407,15 @@ finalize_type_size (tree type)
              && TREE_CODE (type) != QUAL_UNION_TYPE
              && TREE_CODE (type) != ARRAY_TYPE)))
     {
-      TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type));
-      TYPE_USER_ALIGN (type) = 0;
+      unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
+
+      /* Don't override a larger alignment requirement coming from a user
+        alignment of one of the fields.  */
+      if (mode_align >= TYPE_ALIGN (type))
+       {
+         TYPE_ALIGN (type) = mode_align;
+         TYPE_USER_ALIGN (type) = 0;
+       }
     }
 
   /* Do machine-dependent extra alignment.  */
index 42002e9..fe03c79 100644 (file)
@@ -1,3 +1,8 @@
+2005-08-23  J"orn Rennecke <joern.rennecke@st.com>
+
+       PR middle-end/23467
+       * gcc.c-torture/execute/pr23467.c: New test.
+
 2005-08-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/22043
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr23467.c b/gcc/testsuite/gcc.c-torture/execute/pr23467.c
new file mode 100644 (file)
index 0000000..71ec3da
--- /dev/null
@@ -0,0 +1,18 @@
+struct s1
+{
+  int __attribute__ ((aligned (8))) a;
+};
+
+struct
+{
+  char c;
+  struct s1 m;
+} v;
+
+int
+main (void)
+{
+  if ((int)&v.m & 7)
+    abort ();
+  exit (0);
+}