re PR fortran/66993 (Spurious ambiguous symbol error with submodules)
authorPaul Thomas <pault@gcc.gnu.org>
Thu, 10 Sep 2015 15:22:20 +0000 (15:22 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Thu, 10 Sep 2015 15:22:20 +0000 (15:22 +0000)
2015-09-10  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/66993
* module.c (read_module): If a symtree exists and the symbol has
been associated in a submodule from a parent (sub)module, attach
the symbol to a 'unique symtree' and the new symbol to the
existing symtree.

2015-09-10  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/66993
* gfortran.dg/submodule_11.f08: New test.

From-SVN: r227648

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

index 36ab4716312a688ac8c891b722f6d793bbef65eb..4e0d38ff0d1860621d37d76df4d5a5418b4d20da 100644 (file)
@@ -1,3 +1,11 @@
+2015-09-10  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/66993
+       * module.c (read_module): If a symtree exists and the symbol has
+       been associated in a submodule from a parent (sub)module, attach
+       the symbol to a 'unique symtree' and the new symbol to the
+       existing symtree.
+
 2015-09-04  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        * intrinsic.h (gfc_simplify_mvbits): Remove.
index 621ef36d170299547bd01a7f70dfb497ec3a1a1e..d88969e7d5d24ce23b69e04dfef2a11105b84308 100644 (file)
@@ -5132,7 +5132,8 @@ read_module (void)
 
          st = gfc_find_symtree (gfc_current_ns->sym_root, p);
 
-         if (st != NULL)
+         if (st != NULL
+             && !(st->n.sym && st->n.sym->attr.used_in_submodule))
            {
              /* Check for ambiguous symbols.  */
              if (check_for_ambiguous (st, info))
@@ -5142,14 +5143,23 @@ read_module (void)
            }
          else
            {
-             st = gfc_find_symtree (gfc_current_ns->sym_root, name);
-
-             /* Create a symtree node in the current namespace for this
-                symbol.  */
-             st = check_unique_name (p)
-                  ? gfc_get_unique_symtree (gfc_current_ns)
-                  : gfc_new_symtree (&gfc_current_ns->sym_root, p);
-             st->ambiguous = ambiguous;
+             if (st)
+               {
+                 /* This symbol is host associated from a module in a
+                    submodule.  Hide it with a unique symtree.  */
+                 gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns);
+                 s->n.sym = st->n.sym;
+                 st->n.sym = NULL;
+               }
+             else
+               {
+                 /* Create a symtree node in the current namespace for this
+                    symbol.  */
+                 st = check_unique_name (p)
+                      ? gfc_get_unique_symtree (gfc_current_ns)
+                      : gfc_new_symtree (&gfc_current_ns->sym_root, p);
+                 st->ambiguous = ambiguous;
+               }
 
              sym = info->u.rsym.sym;
 
index 844e2a105ee6ee439b79d4e6d5b68e73304c7ea3..1671b4c11ff5accc6d54b772f3ca00bee4c81ff7 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-10  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/66993
+       * gfortran.dg/submodule_11.f08: New test.
+
 2015-09-10  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/67506
 
 2015-08-28  Andrew Bennett  <andrew.bennett@imgtec.com>
 
-       * gcc.target/mips/madd-8.c: Add lo register to clobber list. 
+       * gcc.target/mips/madd-8.c: Add lo register to clobber list.
        * gcc.target/mips/msub-8.c: Ditto
 
 2015-08-27  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
diff --git a/gcc/testsuite/gfortran.dg/submodule_11.f08 b/gcc/testsuite/gfortran.dg/submodule_11.f08
new file mode 100644 (file)
index 0000000..20367a9
--- /dev/null
@@ -0,0 +1,45 @@
+! { dg-do run }
+! Test the fix for PR66993, in which the use associated version of 'i'
+! was incorrectly determined to be ambiguous with the 'i', host associated
+! in submodule 'sm' from the module 'm'. The principle has been tested with
+! the function 'time_two' in addition.
+!
+! Contributed by Mikael Morin  <mikael.morin@sfr.fr>
+!
+module m
+  integer, parameter :: i = -1
+  interface
+    module subroutine show_i
+    end subroutine show_i
+  end interface
+contains
+  integer function times_two (arg)
+    integer :: arg
+    times_two = -2*arg
+  end function
+end module m
+
+module n
+  integer, parameter :: i = 2
+contains
+  integer function times_two (arg)
+    integer :: arg
+    times_two = 2*arg
+  end function
+end module n
+
+submodule (m) sm
+  use n
+contains
+  module subroutine show_i
+    if (i .ne. 2) call abort
+    if (times_two (i) .ne. 4) call abort
+  end subroutine show_i
+end submodule sm
+
+program p
+  use m
+  call show_i
+  if (i .ne. -1) call abort
+  if (times_two (i) .ne. 2) call abort
+end program