O penMP/Fortran: Reject allocatable components in map clause

Message ID 5ef0cf2a-1ae5-e73e-2b79-7fb9c637f1f3@codesourcery.com
State New
Headers show
Series
  • O penMP/Fortran: Reject allocatable components in map clause
Related show

Commit Message

Tobias Burnus June 18, 2020, 1:08 p.m.
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?

Tobias

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'.)

PPS: Not only the OpenMP 5 changes are not yet
supported, also some mapping clause support for
OpenMP 4.5 is still missing on the Fortran side.

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter

Comments

Jose E. Marchesi via Gcc-patches June 18, 2020, 1:12 p.m. | #1
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

Patch

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