The attached bootstraps and regtests on FC23/x86_64 - OK for trunk and later for 7-branch?
The comment in the patch and the ChangeLog are sufficiently clear that no further explanation is needed here. Cheers Paul 2017-05-15 Paul Thomas <pa...@gcc.gnu.org> PR fortran/80554 * decl.c (build_sym): In a submodule allow overriding of host associated symbols from the ancestor module with a new declaration. 2017-05-15 Paul Thomas <pa...@gcc.gnu.org> PR fortran/80554 * gfortran.dg/submodule_29.f08: New test.
Index: gcc/fortran/decl.c =================================================================== *** gcc/fortran/decl.c (revision 246951) --- gcc/fortran/decl.c (working copy) *************** build_sym (const char *name, gfc_charlen *** 1383,1390 **** symbol_attribute attr; gfc_symbol *sym; int upper; ! if (gfc_get_symbol (name, NULL, &sym)) return false; /* Check if the name has already been defined as a type. The --- 1383,1410 ---- symbol_attribute attr; gfc_symbol *sym; int upper; + gfc_symtree *st; ! /* Symbols in a submodule are host associated from the parent module or ! submodules. Therefore, they can be overridden by declarations in the ! submodule scope. Deal with this by attaching the existing symbol to ! a new symtree and recycling the old symtree with a new symbol... */ ! st = gfc_find_symtree (gfc_current_ns->sym_root, name); ! if (st != NULL && gfc_state_stack->state == COMP_SUBMODULE ! && st->n.sym != NULL ! && st->n.sym->attr.host_assoc && st->n.sym->attr.used_in_submodule) ! { ! gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns); ! s->n.sym = st->n.sym; ! sym = gfc_new_symbol (name, gfc_current_ns); ! ! ! st->n.sym = sym; ! sym->refs++; ! gfc_set_sym_referenced (sym); ! } ! /* ...Otherwise generate a new symtree and new symbol. */ ! else if (gfc_get_symbol (name, NULL, &sym)) return false; /* Check if the name has already been defined as a type. The Index: gcc/testsuite/gfortran.dg/submodule_29.f08 =================================================================== *** gcc/testsuite/gfortran.dg/submodule_29.f08 (nonexistent) --- gcc/testsuite/gfortran.dg/submodule_29.f08 (working copy) *************** *** 0 **** --- 1,56 ---- + ! { dg-do run } + ! + ! Test the fix for PR80554 in which it was not recognised that the symbol 'i' + ! is host associated in the submodule 's' so that the new declaration in the + ! submodule was rejected. + ! + ! Contributed by Tamas Bela Feher <tamas.bela.fe...@ipp.mpg.de> + ! + module M + implicit none + integer :: i = 0 + character (100) :: buffer + interface + module subroutine write_i() + end subroutine + end interface + interface + module subroutine write_i_2() + end subroutine + end interface + contains + subroutine foo + integer :: i + end + end module + + submodule (M) S + integer :: i = 137 + contains + module subroutine write_i() + write (buffer,*) i + end subroutine + end submodule + + submodule (M:S) S2 + integer :: i = 1037 + contains + module subroutine write_i_2() + write (buffer,*) i + end subroutine + end submodule + + program test_submod_variable + use M + implicit none + integer :: j + i = 42 + call write_i + read (buffer, *) j + if (i .ne. 42) call abort + if (j .ne. 137) call abort + call write_i_2 + read (buffer, *) j + if (i .ne. 42) call abort + if (j .ne. 1037) call abort + end program