re PR fortran/35997 (Used function interface bug)
authorPaul Thomas <pault@gcc.gnu.org>
Wed, 30 Apr 2008 20:13:21 +0000 (20:13 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Wed, 30 Apr 2008 20:13:21 +0000 (20:13 +0000)
2008-04-30  Paul Thomas  <pault@gcc.gnu.org>

       PR fortran/35997
       * module.c (find_symbol): Do not return a result for a symbol
       that has been renamed in another module.

2008-04-30  Paul Thomas  <pault@gcc.gnu.org>

       PR fortran/35997
       * gfortran.dg/use_rename_3.f90

From-SVN: r134836

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

index 84e8f7b0128209cf021630bf59bb012b5827414c..13fb0528e55330f260e89607ed1127de05e89e28 100644 (file)
@@ -1,3 +1,9 @@
+2008-04-28  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/35997
+       * module.c (find_symbol): Do not return a result for a symbol
+       that has been renamed in another module.
+
 2008-04-26  George Helffrich <george@gcc.gnu.org>
 
        PR fortran/35892
index bc45e9eb9c14315571458d9c78086b163b7e4282..832f68698b4c07b73cdf0458511826ab96ca4d7e 100644 (file)
@@ -3146,13 +3146,14 @@ find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
 /* A recursive function to look for a speficic symbol by name and by
    module.  Whilst several symtrees might point to one symbol, its
    is sufficient for the purposes here than one exist.  Note that
-   generic interfaces are distinguished.  */
+   generic interfaces are distinguished as are symbols that have been
+   renamed in another module.  */
 static gfc_symtree *
 find_symbol (gfc_symtree *st, const char *name,
             const char *module, int generic)
 {
   int c;
-  gfc_symtree *retval;
+  gfc_symtree *retval, *s;
 
   if (st == NULL || st->n.sym == NULL)
     return NULL;
@@ -3162,8 +3163,14 @@ find_symbol (gfc_symtree *st, const char *name,
             && strcmp (module, st->n.sym->module) == 0
             && !check_unique_name (st->name))
     {
-      if ((!generic && !st->n.sym->attr.generic)
-            || (generic && st->n.sym->attr.generic))
+      s = gfc_find_symtree (gfc_current_ns->sym_root, name);
+
+      /* Detect symbols that are renamed by use association in another
+        module by the absence of a symtree and null attr.use_rename,
+        since the latter is not transmitted in the module file.  */
+      if (((!generic && !st->n.sym->attr.generic)
+               || (generic && st->n.sym->attr.generic))
+           && !(s == NULL && !st->n.sym->attr.use_rename))
        return st;
     }
 
index 410b7202cb84d91d365d31a0d3bf3fdb4ccfe31f..ca56282f46387158445c2768908ab6f604fa4a3d 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-28  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/35997
+       * gfortran.dg/use_rename_3.f90
+
 2008-04-30  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/21636
diff --git a/gcc/testsuite/gfortran.dg/use_rename_3.f90 b/gcc/testsuite/gfortran.dg/use_rename_3.f90
new file mode 100644 (file)
index 0000000..9f28e2e
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do compile }
+! Tests the fix for PR35997, in which the use association of renamed
+! valid2 and flag2 was treated as if the renaming were done on use
+! association in the main program.  Thus, the following, direct use
+! association of valid and flag did not occur.
+!
+! Contributed by Drew McCormack <drewmccormack@mac.com>
+!
+module funcinterfacemod
+  interface
+    logical function valid ()
+    end function
+  end interface
+  logical :: flag = .true.
+end module
+
+module secondmod
+  use funcinterfacemod, valid2 => valid, flag2 => flag
+end module
+
+logical function valid ()
+  valid = .true.
+end function
+
+program main
+  use secondmod
+  use funcinterfacemod
+  if (valid ()) then
+    print *, 'Is Valid'
+  endif
+  if (flag) then
+    print *, 'Is flag'
+  endif
+end program
+! { dg-final { cleanup-modules "funcinterfacemod secondmod" } }