aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-stmt.c5
-rw-r--r--gcc/testsuite/gfortran.dg/forall_19.f9032
2 files changed, 35 insertions, 2 deletions
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index adc6b8f..112a4e8 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -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;
diff --git a/gcc/testsuite/gfortran.dg/forall_19.f90 b/gcc/testsuite/gfortran.dg/forall_19.f90
new file mode 100644
index 0000000..ef05c97
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/forall_19.f90
@@ -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