This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, fortran] PR37614 - Change position of padding for aligned COMMONs
- From: "Paul Richard Thomas" <paul dot richard dot thomas at gmail dot com>
- To: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, "Tobias Burnus" <burnus at net-b dot de>
- Date: Sat, 17 Jan 2009 18:36:31 +0100
- Subject: [Patch, fortran] PR37614 - Change position of padding for aligned COMMONs
Dear All,
Before I post this patch for real, I would like to know what you would
like to see by way of an option, if any, to recover the present (and
g77's) behaviour? Maybe this is not needed?
The patch below bootstraps and regtests on FC9/x86_64.
Cheers
Paul
Index: gcc/fortran/trans-common.c
===================================================================
--- gcc/fortran/trans-common.c (revision 143461)
+++ gcc/fortran/trans-common.c (working copy)
@@ -1124,11 +1124,6 @@
s->sym->name, &common->where);
}
}
- else
- {
- /* Offset the whole common block. */
- apply_segment_offset (common_segment, offset);
- }
/* Apply the offset to the new segments. */
apply_segment_offset (current_segment, offset);
Index: gcc/testsuite/gfortran.dg/common_align_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/common_align_2.f90 (revision 0)
+++ gcc/testsuite/gfortran.dg/common_align_2.f90 (revision 0)
@@ -0,0 +1,30 @@
+! { dg-do run }
+! Tests the fix for PR37614, in which the alignment of commons followed
+! g77 rather than the standard or other compilers.
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+!
+subroutine foo (z)
+ real(8) x, y, z
+ common i(8)
+ equivalence (x, i(3)),(y,i(7))
+ if ((i(1) .ne. 42) .or. (i(5) .ne. 43)) call abort
+ if ((i(2) .ne. 0) .or. (i(2) .ne. 0)) call abort
+ if ((x .ne. z) .or. (y .ne. z)) call abort
+end subroutine
+
+subroutine bar
+ common i(8)
+ i = 0
+end subroutine
+
+ real(8) x, y
+ common i, x, j, y ! { dg-warning "Padding" }
+ call bar
+ i = 42
+ j = 43
+ x = atan (1.0)*4.0
+ y = x
+ call foo (x)
+end
+