2016-08-30 Cesar Philippidis <cesar@codesourcery.com>
gcc/
* omp-low.c (lower_omp_target): Handle NULL-sized types for
assumed-sized arrays.
libgomp/
* testsuite/libgomp.oacc-fortran/assumed-size.f90: New test.
@@ -16534,6 +16534,12 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
s = OMP_CLAUSE_SIZE (c);
if (s == NULL_TREE)
s = TYPE_SIZE_UNIT (TREE_TYPE (ovar));
+ /* Fortran assumed-size arrays have zero size because the
+ type is incomplete. Set the size to one to allow the
+ runtime to remap any existing data that is already
+ present on the accelerator. */
+ if (s == NULL_TREE)
+ s = integer_one_node;
s = fold_convert (size_type_node, s);
purpose = size_int (map_idx++);
CONSTRUCTOR_APPEND_ELT (vsize, purpose, s);
new file mode 100644
@@ -0,0 +1,31 @@
+! Test if implicitly determined data clauses work with an
+! assumed-sized array variable. Note that the array variable, 'a',
+! has been explicitly copied in and out via acc enter data and acc
+! exit data, respectively.
+
+program test
+ implicit none
+
+ integer, parameter :: n = 100
+ integer a(n), i
+
+ call dtest (a, n)
+
+ do i = 1, n
+ if (a(i) /= i) call abort
+ end do
+end program test
+
+subroutine dtest (a, n)
+ integer i, n
+ integer a(*)
+
+ !$acc enter data copyin(a(1:n))
+
+ !$acc parallel loop
+ do i = 1, n
+ a(i) = i
+ end do
+
+ !$acc exit data copyout(a(1:n))
+end subroutine dtest