PR fortran/98307 - Dependency check fails when using "allocatable"

The dependency check for FORALL constructs already handled pointer
components to derived types, but missed allocatables.  Fix that.

gcc/fortran/ChangeLog:

	PR fortran/98307
	* trans-stmt.c (check_forall_dependencies): Extend dependency
	check to allocatable components of derived types.

gcc/testsuite/ChangeLog:

	PR fortran/98307
	* gfortran.dg/forall_19.f90: New test.
This commit is contained in:
Harald Anlauf 2020-12-17 10:31:55 +01:00
parent 6f8486523f
commit c09deceb53
2 changed files with 35 additions and 2 deletions

View File

@ -3949,9 +3949,10 @@ check_forall_dependencies (gfc_code *c, stmtblock_t *pre, stmtblock_t *post)
point to the copy instead. Note that the shallow copy of
the variable will not suffice for derived types with
pointer components. We therefore leave these to their
own devices. */
own devices. Likewise for allocatable components. */
if (lsym->ts.type == BT_DERIVED
&& lsym->ts.u.derived->attr.pointer_comp)
&& (lsym->ts.u.derived->attr.pointer_comp
|| lsym->ts.u.derived->attr.alloc_comp))
return need_temp;
new_symtree = NULL;

View File

@ -0,0 +1,32 @@
! { dg-do run }
! PR fortran/98307 - Dependency check fails when using "allocatable"
program forall_deps
implicit none
type t
logical :: valid = .true.
integer :: s = 0
integer, allocatable :: p(:)
end type
type(t) :: v(2)
integer :: i
allocate (v(1)%p(8))
allocate (v(2)%p(8))
v(1)%s = 8
v(2)%s = 6
v(1)%p(:) = [1, 2, 3, 4, 5, 6, 7, 8]
v(2)%p(:) = [13, 14, 15, 16, 17, 18, 19, 20]
forall (i=1:2)
v(i)%p(1:v(i)%s) = v(3-i)%p(1:v(i)%s)
end forall
if (any(v(2)%p(:) /= [1, 2, 3, 4, 5, 6, 19, 20])) stop 1
v(1)%p(:) = [1, 2, 3, 4, 5, 6, 7, 8]
v(2)%p(:) = [13, 14, 15, 16, 17, 18, 19, 20]
forall (i=1:2, v(i)%valid)
v(i)%p(1:v(i)%s) = v(3-i)%p(1:v(i)%s)
end forall
if (any(v(2)%p(:) /= [1, 2, 3, 4, 5, 6, 19, 20])) stop 2
end