aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2004-05-29 01:21:51 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2004-05-29 01:21:51 +0000
commit353c3b7e16645aa9e2be04e80707e256965642e4 (patch)
tree247774f94be446e16946bbb9f3c16c77c9b72c15
parentb1243dd57bc4692e15fa8eaa8e6e566aaa65d289 (diff)
downloadgcc-353c3b7e16645aa9e2be04e80707e256965642e4.zip
gcc-353c3b7e16645aa9e2be04e80707e256965642e4.tar.gz
gcc-353c3b7e16645aa9e2be04e80707e256965642e4.tar.bz2
trans-common.c (find_equivalence): Find multiple rules.
* trans-common.c (find_equivalence): Find multiple rules. testsuite/ * gfortran.fortran-torture/execute/equiv_1.f90: New test. From-SVN: r82411
-rw-r--r--gcc/fortran/ChangeLog4
-rw-r--r--gcc/fortran/trans-common.c12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/equiv_1.f9015
4 files changed, 31 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 69fa1f5..786cc39 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,7 @@
+2004-05-29 Paul Brook <paul@codesourcery.com>
+
+ * trans-common.c (find_equivalence): Find multiple rules.
+
2004-05-27 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
* gfortran.h (gfc_current_locus, gfc_set_locus): Remove.
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index 458dbef..7484284 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -649,7 +649,8 @@ add_condition (segment_info *f, gfc_equiv *eq1, gfc_equiv *eq2)
/* Given a segment element, search through the equivalence lists for unused
- conditions that involve the symbol. Add these rules to the segment. */
+ conditions that involve the symbol. Add these rules to the segment. Only
+ checks for rules involving the first symbol in the equivalence set. */
static bool
find_equivalence (segment_info *f)
@@ -666,7 +667,7 @@ find_equivalence (segment_info *f)
if (l->used)
continue;
- if (c->expr->symtree->n.sym ==f-> sym)
+ if (c->expr->symtree->n.sym == f-> sym)
{
eq = c;
other = l;
@@ -682,9 +683,12 @@ find_equivalence (segment_info *f)
if (eq)
{
add_condition (f, eq, other);
- l->used = 1;
+ eq->used = 1;
found = TRUE;
- break;
+ /* If this symbol is the fist in the chain we may find other
+ matches. Otherwise we can skip to the next equivalence. */
+ if (eq == l)
+ break;
}
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c420121..96b7c93 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-05-29 Paul Brook <paul@codesourcery.com>
+
+ * gfortran.fortran-torture/execute/equiv_1.f90: New test.
+
2004-05-28 Ziemowit Laski <zlaski@apple.com>
* gcc.dg/altivec-16.c: New test.
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/equiv_1.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/equiv_1.f90
new file mode 100644
index 0000000..b4719fc
--- /dev/null
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/equiv_1.f90
@@ -0,0 +1,15 @@
+program prog
+ common /block/ i
+ equivalence (a, b, c), (i, j, k ,l)
+ a = 1.0
+ b = 2.0
+ c = 3.0
+ i = 1
+ j = 2
+ k = 3
+ l = 4
+
+ if ((a .ne. 3.0) .or. (b .ne. 3.0) .or. (c .ne. 3.0)) call abort ()
+ if ((i .ne. 4) .or. (j .ne. 4) .or. (k .ne. 4) .or. (l .ne. 4)) &
+ call abort ()
+end program