[gomp3] Assumed-size arrays are now predetermined to have actual argument's sharing

Jakub Jelinek jakub@redhat.com
Tue Feb 26 21:11:00 GMT 2008


Hi!

OpenMP 3.0 unlike 2.5 says that assumed-size arrays are predetermined
to share the sharing status with corresponding actual argument (which for
gcc is predetermined shared).  Assumed-size arrays are still allowed
to be in shared() clauses, and keep being disallowed in private/firstprivate
etc.

Committed to gomp-3_0-branch.

2008-02-26  Jakub Jelinek  <jakub@redhat.com>

	* trans-openmp.c (gfc_omp_predetermined_sharing): Return
	OMP_CLAUSE_DEFAULT_SHARED for assumed-size arrays.

	* gfortran.dg/gomp/sharing-3.f90: New test.

--- gcc/fortran/trans-openmp.c	(revision 132481)
+++ gcc/fortran/trans-openmp.c	(working copy)
@@ -84,6 +84,17 @@ gfc_omp_predetermined_sharing (tree decl
   if (GFC_DECL_CRAY_POINTEE (decl))
     return OMP_CLAUSE_DEFAULT_PRIVATE;
 
+  /* Assumed-size arrays are predetermined to inherit sharing
+     attributes of the associated actual argument, which is shared
+     for all we care.  */
+  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)
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
   /* COMMON and EQUIVALENCE decls are shared.  They
      are only referenced through DECL_VALUE_EXPR of the variables
      contained in them.  If those are privatized, they will not be
--- gcc/testsuite/gfortran.dg/gomp/sharing-3.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/gomp/sharing-3.f90	(revision 0)
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! { dg-options "-fopenmp" }
+
+subroutine foo (vara, varb, varc, vard, n)
+  integer :: n, vara(n), varb(*), varc(:), vard(6), vare(6)
+  vare(:) = 0
+  !$omp parallel default(none) shared(vara, varb, varc, vard, vare)
+    !$omp master   
+      vara(1) = 1
+      varb(1) = 1
+      varc(1) = 1
+      vard(1) = 1
+      vare(1) = 1
+    !$omp end master
+  !$omp end parallel
+  !$omp parallel default(none) private(vara, varc, vard, vare)
+    vara(1) = 1
+    varc(1) = 1
+    vard(1) = 1
+    vare(1) = 1
+  !$omp end parallel
+  !$omp parallel default(none) firstprivate(vara, varc, vard, vare)
+    vara(1) = 1
+    varc(1) = 1
+    vard(1) = 1
+    vare(1) = 1
+  !$omp end parallel
+  !$omp parallel default(none)	! { dg-error "enclosing parallel" }
+    !$omp master
+      vara(1) = 1		! { dg-error "not specified" }
+      varb(1) = 1		! Assumed-size is predetermined
+      varc(1) = 1		! { dg-error "not specified" "" { xfail *-*-* } }
+      vard(1) = 1		! { dg-error "not specified" }
+      vare(1) = 1		! { dg-error "not specified" }
+    !$omp end master
+  !$omp end parallel
+end subroutine foo

	Jakub



More information about the Fortran mailing list