re PR libfortran/80850 (Sourced allocate() fails to allocate a pointer)

2017-11-01  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/80850
	* trans_expr.c (gfc_conv_procedure_call): When passing a class
	argument to an unlimited polymorphic dummy, it is wrong to cast
	the passed expression as unlimited, unless it is unlimited. The
	correct way is to assign to each of the fields and set the _len
	field to zero.

2017-11-01  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/80850
	* gfortran.dg/class_64_f90 : New test.

From-SVN: r254299
This commit is contained in:
Paul Thomas 2017-11-01 11:29:07 +00:00
parent aafe60b2f4
commit 3ce323d917
4 changed files with 91 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2017-11-01 Paul Thomas <pault@gcc.gnu.org>
Backported from trunk
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-11-01 Paul Thomas <pault@gcc.gnu.org>
Backport from trunk

View File

@ -1383,8 +1383,28 @@ build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
symbol_attribute attr;
gfc_symbol *sym;
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;
/* Check if the name has already been defined as a type. The

View File

@ -1,3 +1,9 @@
2017-11-01 Paul Thomas <pault@gcc.gnu.org>
Backported from trunk
PR fortran/80554
* gfortran.dg/submodule_29.f08: New test.
2017-11-01 Martin Jambor <mjambor@suse.cz>
PR c++/81702

View File

@ -0,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