From: Paul Brook Date: Sun, 16 Jan 2005 12:05:53 +0000 (+0000) Subject: re PR fortran/17675 ([Regression w.r.t. g77] Alignment constraints not honored in... X-Git-Tag: releases/gcc-4.0.0~1538 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=36c028f675622046a0f0261cc62c70f58e9a3b4b;p=thirdparty%2Fgcc.git re PR fortran/17675 ([Regression w.r.t. g77] Alignment constraints not honored in EQUIVALENCE) 2004-01-16 Paul Brook PR fortran/17675 * trans-common.c (translate_common): Remove duplicate function call. (finish_equivalences): Preserve alignment when biasing offsets. testsuite/ * gfortran.dg/common_4.f90: New test. From-SVN: r93724 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ba8e5b86846c..8fa62a2b7a23 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2004-01-16 Paul Brook + + PR fortran/17675 + * trans-common.c (translate_common): Remove duplicate function call. + (finish_equivalences): Preserve alignment when biasing offsets. + 2005-01-15 Tobias Schl"uter name, &common->where); offset = align_segment (&align); - apply_segment_offset (current_segment, offset); if (offset & (max_align - 1)) { @@ -851,7 +850,8 @@ finish_equivalences (gfc_namespace *ns) { gfc_equiv *z, *y; gfc_symbol *sym; - HOST_WIDE_INT min_offset; + HOST_WIDE_INT offset; + unsigned HOST_WIDE_INT align; for (z = ns->equiv; z; z = z->next) for (y = z->eq; y; y = y->eq) @@ -864,13 +864,13 @@ finish_equivalences (gfc_namespace *ns) /* All objects directly or indirectly equivalenced with this symbol. */ add_equivalences (); - /* Bias the offsets to to start at zero. */ - min_offset = -current_segment->offset; + /* Align the block. */ + offset = align_segment (&align); - /* Ensure the block is properly aligned. */ - min_offset += align_segment (NULL); + /* Ensure all offsets are positive. */ + offset -= current_segment->offset & ~(align - 1); - apply_segment_offset (current_segment, min_offset); + apply_segment_offset (current_segment, offset); /* Create the decl. */ create_common (NULL, current_segment); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7930770a93be..821cfea0393b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-01-16 Paul Brook + + * gfortran.dg/common_4.f90: New test. + 2005-01-15 Hans-Peter Nilsson PR rtl-optimization/19462 diff --git a/gcc/testsuite/gfortran.dg/common_4.f90 b/gcc/testsuite/gfortran.dg/common_4.f90 new file mode 100644 index 000000000000..9ff21230da98 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/common_4.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +! Suppress warnings about misaligned common blocks. +! { dg-options "-w" } +! Check misaligned common blocks. +program prog + common /block/ a, b, c + integer*1 a + integer*4 b, c + a = 1 + b = HUGE(b) + c = 2 + call foo +end program +subroutine foo + common /block/ a, b, c + integer*1 a + integer*4 b, c + if (a .ne. 1 .or. b .ne. HUGE(b) .or. c .ne. 2) call abort +end subroutine