[multiple changes]
authorSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 5 Jun 2015 16:54:53 +0000 (16:54 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 5 Jun 2015 16:54:53 +0000 (16:54 +0000)
2015-06-03  Russell Whitesides  <russelldub@gmail.com>
    Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/40958
PR fortran/60780
PR fortran/66377
* module.c (load_equiv): Add check for loading duplicate EQUIVALENCEs
from different modules.  Eliminate the pruning of unused
equivalence-objects

2015-06-03  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/66377
gfortran.dg/equiv_9.f90: New test.

From-SVN: r224159

gcc/fortran/ChangeLog
gcc/fortran/module.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/equiv_9.f90 [new file with mode: 0644]

index b446e90122c861c12bb673e7dc2c64a625d5b36b..2bf67171c0728712399872cfc5cbec7f36d9e317 100644 (file)
@@ -1,3 +1,13 @@
+2015-06-05  Russell Whitesides  <russelldub@gmail.com>
+           Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/40958
+       PR fortran/60780
+       PR fortran/66377
+       * module.c (load_equiv): Add check for loading duplicate EQUIVALENCEs
+       from different modules.  Eliminate the pruning of unused
+       equivalence-objects
+
 2015-06-04  Thomas Koenig  <tkoenig@netcologne.de>
 
        PR fortran/58749
index 4122c956d3ee5e8732e344ab2fda58bd37b4f210..e183d908ab408e866120befdda63611b9f36f109 100644 (file)
@@ -4476,8 +4476,8 @@ load_commons (void)
 static void
 load_equiv (void)
 {
-  gfc_equiv *head, *tail, *end, *eq;
-  bool unused;
+  gfc_equiv *head, *tail, *end, *eq, *equiv;
+  bool duplicate;
 
   mio_lparen ();
   in_load_equiv = true;
@@ -4504,23 +4504,19 @@ load_equiv (void)
        mio_expr (&tail->expr);
       }
 
-    /* Unused equivalence members have a unique name.  In addition, it
-       must be checked that the symbols are from the same module.  */
-    unused = true;
-    for (eq = head; eq; eq = eq->eq)
+    /* Check for duplicate equivalences being loaded from different modules */
+    duplicate = false;
+    for (equiv = gfc_current_ns->equiv; equiv; equiv = equiv->next)
       {
-       if (eq->expr->symtree->n.sym->module
-             && head->expr->symtree->n.sym->module
-             && strcmp (head->expr->symtree->n.sym->module,
-                        eq->expr->symtree->n.sym->module) == 0
-             && !check_unique_name (eq->expr->symtree->name))
+       if (equiv->module && head->module
+           && strcmp (equiv->module, head->module) == 0)
          {
-           unused = false;
+           duplicate = true;
            break;
          }
       }
 
-    if (unused)
+    if (duplicate)
       {
        for (eq = head; eq; eq = head)
          {
index c5adc35b8ed61c4ba21901c67894aa80c36d0e90..e96238344096bd08b04c2f31492876baf36f5941 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-05  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/66377
+       gfortran.dg/equiv_9.f90: New test.
+
+
 2015-06-05  Tom de Vries  <tom@codesourcery.com>
 
        merge from gomp4 branch:
diff --git a/gcc/testsuite/gfortran.dg/equiv_9.f90 b/gcc/testsuite/gfortran.dg/equiv_9.f90
new file mode 100644 (file)
index 0000000..28f0bb8
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do run }
+! PR fortran/66377
+!
+module constant
+  integer x1, x2, x3
+  integer x(3)
+  equivalence (x(1),x1), (x2,x(2)), (x3,x(3))
+end module
+
+program test
+  use constant
+  implicit none 
+  x = (/1, 2, 3/)
+  call another()
+end program
+
+subroutine another()
+   use constant, only : x2
+   implicit none
+   if (x2 /= 2) call abort
+end subroutine
+! { dg-final { cleanup-modules "constant" } }