[Patch, fortran] PR80554 [f08] variable redefinition in submodule
Paul Richard Thomas
paul.richard.thomas@gmail.com
Mon May 15 11:10:00 GMT 2017
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 <pault@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 <pault@gcc.gnu.org>
PR fortran/80554
* gfortran.dg/submodule_29.f08: New test.
-------------- next part --------------
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.feher@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
More information about the Fortran
mailing list