This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] Disallow explicit or implicit OpenMP mapping of assumed-size arrays (PR fortran/78866)


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  <jakub@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]