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:
parent
6f8486523f
commit
c09deceb53
@ -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;
|
||||
|
32
gcc/testsuite/gfortran.dg/forall_19.f90
Normal file
32
gcc/testsuite/gfortran.dg/forall_19.f90
Normal 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
|
Loading…
Reference in New Issue
Block a user