[Patch, fortran] PR37614 - Change position of padding for aligned COMMONs

Paul Richard Thomas paul.richard.thomas@gmail.com
Sat Jan 17 17:46:00 GMT 2009


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
+



More information about the Fortran mailing list