trans-common.c (find_equivalence): Find multiple rules.
authorPaul Brook <paul@codesourcery.com>
Sat, 29 May 2004 01:21:51 +0000 (01:21 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Sat, 29 May 2004 01:21:51 +0000 (01:21 +0000)
* trans-common.c (find_equivalence): Find multiple rules.
testsuite/
* gfortran.fortran-torture/execute/equiv_1.f90: New test.

From-SVN: r82411

gcc/fortran/ChangeLog
gcc/fortran/trans-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/execute/equiv_1.f90 [new file with mode: 0644]

index 69fa1f563c6d773640b82aebbfb4257b6b64e5a5..786cc39077e41b3f337d2ab7c580b82a3c6fd04e 100644 (file)
@@ -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.
index 458dbeff3682e7bc6f1f28df30c8d7a5b12a0a0c..7484284730748917144a7812b4b7939826d1b911 100644 (file)
@@ -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;
            }
        }
     }
index c42012155715a4c1fe606c42d2cffe3cef61461c..96b7c9377658479ef38ed12256126debc8014d92 100644 (file)
@@ -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 (file)
index 0000000..b4719fc
--- /dev/null
@@ -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