Message ID | 5ef0cf2a-1ae5-e73e-2b79-7fb9c637f1f3@codesourcery.com |
---|---|
State | New |
Headers | show |
Series | O penMP/Fortran: Reject allocatable components in map clause | expand |
On Thu, Jun 18, 2020 at 03:08:53PM +0200, Tobias Burnus wrote: > OpenMP 4.5 does not permit allocatable components in > list items of the map clause. (OpenMP 5 does.) > As OpenMP 5 support is not implemented, let's avoid > generating wrong code by diagnosing this (until > implemented). > > OK? Ok. > PS: I wonder whether something similar is needed > for 'private' and 'firstprivate' on target. The > allocatable-component restriction is only in the > 'map' clause. However, private/firstprivate have > the same issue. (Except that it is much less likely > that a user puts a complicated variable in 'private' > or 'firstprivate'.) Probably. Jakub
OpenMP/Fortran: Reject allocatable components in map clause gcc/fortran/ChangeLog: * openmp.c (resolve_omp_clauses): Reject vars with allocatable components in OpenMP map clauses. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/map-alloc-comp-1.f90: New test. diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 94522d16e6d..e681903c7c2 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -4636,6 +4636,13 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, && 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 (!openacc + && list == OMP_LIST_MAP + && n->sym->ts.type == BT_DERIVED + && n->sym->ts.u.derived->attr.alloc_comp) + gfc_error ("List item %qs with allocatable components is not " + "permitted in map clause at %L", n->sym->name, + &n->where); if (list == OMP_LIST_MAP && !openacc) switch (code->op) { diff --git a/gcc/testsuite/gfortran.dg/gomp/map-alloc-comp-1.f90 b/gcc/testsuite/gfortran.dg/gomp/map-alloc-comp-1.f90 new file mode 100644 index 00000000000..0c4429677bd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/map-alloc-comp-1.f90 @@ -0,0 +1,14 @@ +! +! ALLOCATABLE COMPONENTS: +! - OpenMP 5: Permitted (and automatically recursively mapped) +! -> Not yet supported. +! - OpenMP 4.5: Not permitted. +! +implicit none (type, external) +type sct + integer, allocatable :: c +end type +type(sct) var + +!$omp target enter data map(to:var) ! { dg-error "allocatable components is not permitted in map clause" } +end