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:
parent
aafe60b2f4
commit
3ce323d917
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue