Hi! At least in my reading of the standard OpenMP 4.[05] does not disallow explicit or implicit mapping of assumed-size arrays, but it is IMNSHO a defect in the standard, it is something that can't be really supported because the compiler does not know the size of the assumed size array. What works and is supported is explicit mapping of array section with the upper bound specificied, then you give it the size through the array section. ifort also rejects it. I've raised an OpenMP ticket for this.
Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk, queued for 6.4. 2016-12-21 Jakub Jelinek <ja...@redhat.com> PR fortran/78866 * openmp.c (resolve_omp_clauses): Diagnose assumed size arrays in OpenMP map, to and from clauses. * trans-openmp.c: Include diagnostic-core.h, temporarily redefining GCC_DIAG_STYLE to __gcc_tdiag__. (gfc_omp_finish_clause): Diagnose implicitly mapped assumed size arrays. * gfortran.dg/gomp/map-1.f90: Add expected error. * gfortran.dg/gomp/pr78866-1.f90: New test. * gfortran.dg/gomp/pr78866-2.f90: New test. --- gcc/fortran/openmp.c.jj 2016-11-10 12:34:12.000000000 +0100 +++ gcc/fortran/openmp.c 2016-12-21 10:36:25.535619047 +0100 @@ -4382,6 +4382,11 @@ resolve_omp_clauses (gfc_code *code, gfc else resolve_oacc_data_clauses (n->sym, n->where, name); } + else if (list != OMP_CLAUSE_DEPEND + && n->sym->as + && n->sym->as->type == AS_ASSUMED_SIZE) + gfc_error ("Assumed size array %qs in %s clause at %L", + n->sym->name, name, &n->where); if (list == OMP_LIST_MAP && !openacc) switch (code->op) { --- gcc/fortran/trans-openmp.c.jj 2016-12-15 10:26:19.000000000 +0100 +++ gcc/fortran/trans-openmp.c 2016-12-21 13:11:34.131670305 +0100 @@ -38,6 +38,11 @@ along with GCC; see the file COPYING3. #include "gomp-constants.h" #include "omp-general.h" #include "omp-low.h" +#undef GCC_DIAG_STYLE +#define GCC_DIAG_STYLE __gcc_tdiag__ +#include "diagnostic-core.h" +#undef GCC_DIAG_STYLE +#define GCC_DIAG_STYLE __gcc_gfc__ int ompws_flags; @@ -1039,6 +1044,21 @@ gfc_omp_finish_clause (tree c, gimple_se return; tree decl = OMP_CLAUSE_DECL (c); + + /* Assumed-size arrays can't be mapped implicitly, they have to be + mapped explicitly using array sections. */ + if (TREE_CODE (decl) == PARM_DECL + && GFC_ARRAY_TYPE_P (TREE_TYPE (decl)) + && GFC_TYPE_ARRAY_AKIND (TREE_TYPE (decl)) == GFC_ARRAY_UNKNOWN + && GFC_TYPE_ARRAY_UBOUND (TREE_TYPE (decl), + GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)) - 1) + == NULL) + { + error_at (OMP_CLAUSE_LOCATION (c), + "implicit mapping of assumed size array %qD", decl); + return; + } + tree c2 = NULL_TREE, c3 = NULL_TREE, c4 = NULL_TREE; if (POINTER_TYPE_P (TREE_TYPE (decl))) { --- gcc/testsuite/gfortran.dg/gomp/map-1.f90.jj 2015-01-15 23:39:06.000000000 +0100 +++ gcc/testsuite/gfortran.dg/gomp/map-1.f90 2016-12-21 13:29:03.333952262 +0100 @@ -70,7 +70,7 @@ subroutine test(aas) ! { dg-error "Rightmost upper bound of assumed size array section not specified" "" { target *-*-* } 68 } ! { dg-error "'aas' in MAP clause at \\\(1\\\) is not a proper array section" "" { target *-*-* } 68 } - !$omp target map(aas) ! { dg-error "The upper bound in the last dimension must appear" "" { xfail *-*-* } } + !$omp target map(aas) ! { dg-error "Assumed size array" } !$omp end target !$omp target map(aas(5:7)) --- gcc/testsuite/gfortran.dg/gomp/pr78866-1.f90.jj 2016-12-21 11:16:06.202498432 +0100 +++ gcc/testsuite/gfortran.dg/gomp/pr78866-1.f90 2016-12-21 11:12:14.000000000 +0100 @@ -0,0 +1,19 @@ +! PR fortran/78866 +! { dg-do compile } + +subroutine pr78866(x) + integer :: x(*) +!$omp target map(x) ! { dg-error "Assumed size array" } + x(1) = 1 +!$omp end target +!$omp target data map(tofrom: x) ! { dg-error "Assumed size array" } +!$omp target update to(x) ! { dg-error "Assumed size array" } +!$omp target update from(x) ! { dg-error "Assumed size array" } +!$omp end target data +!$omp target map(x(:23)) ! { dg-bogus "Assumed size array" } + x(1) = 1 +!$omp end target +!$omp target map(x(:)) ! { dg-error "upper bound of assumed size array section" } + x(1) = 1 ! { dg-error "not a proper array section" "" { target *-*-* } .-1 } +!$omp end target +end --- gcc/testsuite/gfortran.dg/gomp/pr78866-2.f90.jj 2016-12-21 13:23:21.100447198 +0100 +++ gcc/testsuite/gfortran.dg/gomp/pr78866-2.f90 2016-12-21 13:14:52.000000000 +0100 @@ -0,0 +1,9 @@ +! PR fortran/78866 +! { dg-do compile } + +subroutine pr78866(x) + integer :: x(*) +!$omp target ! { dg-error "implicit mapping of assumed size array" } + x(1) = 1 +!$omp end target +end Jakub