Dear All, This is a very straight forward patch of a problem picked up by Mikael. Since module symbols host associated in the submodule statement are read using the use association mechanism, the can be wrongly detected as being ambiguous with use associated symbols. The latter have precedence, since the module is host. The fix attaches the host associated symbol to a 'unique symtree' and procedes to process the use associated symbol, using the existing symtree.
Bootstraps and regtests on FC21/x86_64 - OK for trunk? Paul 2015-08-10 Paul Thomas <pa...@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-08-10 Paul Thomas <pa...@gcc.gnu.org> PR fortran/66993 * gfortran.dg/submodule_11.f08: New test.
Index: gcc/fortran/module.c =================================================================== *** gcc/fortran/module.c (revision 227527) --- gcc/fortran/module.c (working copy) *************** read_module (void) *** 5132,5138 **** st = gfc_find_symtree (gfc_current_ns->sym_root, p); ! if (st != NULL) { /* Check for ambiguous symbols. */ if (check_for_ambiguous (st, info)) --- 5140,5147 ---- st = gfc_find_symtree (gfc_current_ns->sym_root, p); ! if (st != NULL ! && !(st->n.sym && st->n.sym->attr.used_in_submodule)) { /* Check for ambiguous symbols. */ if (check_for_ambiguous (st, info)) *************** read_module (void) *** 5142,5155 **** } 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; sym = info->u.rsym.sym; --- 5151,5173 ---- } else { ! 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: gcc/testsuite/gfortran.dg/submodule_11.f08 =================================================================== *** gcc/testsuite/gfortran.dg/submodule_11.f08 (revision 0) --- gcc/testsuite/gfortran.dg/submodule_11.f08 (working copy) *************** *** 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.mo...@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