Commit bedee914 by Paul Thomas

re PR fortran/80554 ([f08] variable redefinition in submodule)

2017-05-16  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-16  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/80554
	* gfortran.dg/submodule_29.f08: New test.

From-SVN: r248129
parent 10791753
2017-05-16 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 Steven G. Kargl <kargl@gcc.gnu.org> 2017-05-15 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/80674 PR fortran/80674
...@@ -18,7 +25,7 @@ ...@@ -18,7 +25,7 @@
end and stride expressions end and stride expressions
(gfc_advance_section): Simplify start and end (gfc_advance_section): Simplify start and end
expressions expressions
(gfc_get_section_index): Simplify start expression (gfc_get_section_index): Simplify start expression
2017-05-13 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2017-05-13 Jerry DeLisle <jvdelisle@gcc.gnu.org>
...@@ -35,7 +42,7 @@ ...@@ -35,7 +42,7 @@
Fortran 95 restriction on namelist objects. Fortran 95 restriction on namelist objects.
2017-05-11 Nathan Sidwell <nathan@acm.org> 2017-05-11 Nathan Sidwell <nathan@acm.org>
* trans-decl.c: Include dumpfile.h not tree-dump.h, * trans-decl.c: Include dumpfile.h not tree-dump.h,
2017-05-09 Janus Weil <janus@gcc.gnu.org> 2017-05-09 Janus Weil <janus@gcc.gnu.org>
......
...@@ -1383,8 +1383,28 @@ build_sym (const char *name, gfc_charlen *cl, bool cl_deferred, ...@@ -1383,8 +1383,28 @@ build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
symbol_attribute attr; symbol_attribute attr;
gfc_symbol *sym; gfc_symbol *sym;
int upper; int upper;
gfc_symtree *st;
if (gfc_get_symbol (name, NULL, &sym)) /* 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; return false;
/* Check if the name has already been defined as a type. The /* Check if the name has already been defined as a type. The
......
2017-05-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/80554
* gfortran.dg/submodule_29.f08: New test.
2017-05-16 David Malcolm <dmalcolm@redhat.com> 2017-05-16 David Malcolm <dmalcolm@redhat.com>
* g++.dg/other/accessor-fixits-1.C: New test case. * g++.dg/other/accessor-fixits-1.C: New test case.
...@@ -1279,7 +1284,7 @@ ...@@ -1279,7 +1284,7 @@
* gcc.dg/tree-ssa/vrp35.c: Disable EVRP. * gcc.dg/tree-ssa/vrp35.c: Disable EVRP.
* gcc.dg/tree-ssa/vrp36.c: Likewise. * gcc.dg/tree-ssa/vrp36.c: Likewise.
* gcc.dg/tree-ssa/pr49039.c: Likewise. * gcc.dg/tree-ssa/pr49039.c: Likewise.
2017-04-27 Marek Polacek <polacek@redhat.com> 2017-04-27 Marek Polacek <polacek@redhat.com>
PR sanitizer/80349 PR sanitizer/80349
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment