Hi Thomas, hi all

Updated patch. Changes: Testcases split + updated/extended.
OK for mainline?

Regarding the comments:

On 09.02.21 10:45, Thomas Schwinge wrote:
Thanks for filing/locating these discussion items for OpenACC/OpenMP
upstream.  May also put these references into the testcases, so that once
these get addressed, we have something to 'grep' for in GCC?

Actually, they are already in the file. Alternative is to add them as
link, but I am not sure that's better. (I moved them now to the top.)

I note that 'zz' variants (see below) are not being checked for OpenMP

I have now added them; I had them before but as many checks triggered,
I thought the tests were not really worthwhile.

+!$acc update self(zz%re)
+!$acc update self(zz%im)
+end
And for OpenACC, the 'zz' variants do not emit this error message here.
(That's not immediately obvious to me.)

Answer: 'git add' missing. The reason is that with and without
Julian's patch, the error message is different. Without his patch,
the error is:
!$acc update self(zz%re) ! { dg-error "not a proper array section" }

I can see how data mapping of '[...]%re' etc. are problematic (we're
constructing an "incomplete object"?), but 'update' etc. I'd have
expected to work: would just copy the respective "part".
Granted. The array(:)%re access might update too much, but that's not
different to array with strides or with contiguous arrays sections
which contain component reference (and more than one component).

But that's more a question for the spec committee – if it is supposed
to work, the code needs to be updated.

Tobias



-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München 
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank 
Thürauf
Fortran: %re/%im fixes for OpenMP/OpenACC + gfc_is_simplify_contiguous

gcc/fortran/ChangeLog:

	* expr.c (gfc_is_simplify_contiguous): Handle REF_INQUIRY, i.e.
	%im and %re which are EXPR_VARIABLE.
	* openmp.c (resolve_omp_clauses): Diagnose %re/%im explicitly.

gcc/testsuite/ChangeLog:

	* gfortran.dg/goacc/ref_inquiry.f90: New test.
	* gfortran.dg/gomp/ref_inquiry.f90: New test.

 gcc/fortran/expr.c                              |  2 +
 gcc/fortran/openmp.c                            |  8 ++++
 gcc/testsuite/gfortran.dg/goacc/ref_inquiry.f90 | 52 +++++++++++++++++++++++++
 gcc/testsuite/gfortran.dg/gomp/ref_inquiry.f90  | 39 +++++++++++++++++++
 4 files changed, 101 insertions(+)

diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 4f456fc629a..92a6700568d 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -5854,6 +5854,8 @@ gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
 	part_ref  = ref;
       else if (ref->type == REF_SUBSTRING)
 	return false;
+      else if (ref->type == REF_INQUIRY)
+	return false;
       else if (ref->u.ar.type != AR_ELEMENT)
 	ar = &ref->u.ar;
     }
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 797f6c86b62..f0307c801a5 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5219,6 +5219,14 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
 				&& array_ref->next->type == REF_SUBSTRING)))
 		      gfc_error ("Unexpected substring reference in %s clause "
 				 "at %L", name, &n->where);
+		    else if (array_ref && array_ref->type == REF_INQUIRY)
+		      {
+			gcc_assert (array_ref->u.i == INQUIRY_RE
+				    || array_ref->u.i == INQUIRY_IM);
+			gfc_error ("Unexpected complex-parts designator "
+				   "reference in %s clause at %L",
+				   name, &n->where);
+		      }
 		    else if (!resolved
 			|| n->expr->expr_type != EXPR_VARIABLE
 			|| array_ref->next
diff --git a/gcc/testsuite/gfortran.dg/goacc/ref_inquiry.f90 b/gcc/testsuite/gfortran.dg/goacc/ref_inquiry.f90
new file mode 100644
index 00000000000..274065dae94
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/ref_inquiry.f90
@@ -0,0 +1,52 @@
+! Check for <var>%re, ...%im, ...%kind, ...%len
+! Cf. also OpenMP's ../gomp/ref_inquiry.f90
+! Cf. OpenACC spec issue 346
+! 
+implicit none
+type t
+  integer :: i
+  character :: c
+  complex :: z
+  complex :: zz(5)
+end type t
+
+integer :: i
+character(kind=4, len=5) :: c
+complex :: z, zz(5)
+type(t) :: x
+
+print *, is_contiguous(zz(:)%re)
+
+! inquiry function; expr_type != EXPR_VARIABLE:
+!$acc enter data copyin(i%kind, c%len)     ! { dg-error "not a proper array section" }
+!$acc enter data copyin(x%i%kind)          ! { dg-error "not a proper array section" }
+!$acc enter data copyin(x%c%len)           ! { dg-error "not a proper array section" }
+!$acc update self(i%kind, c%len)           ! { dg-error "not a proper array section" }
+!$acc update self(x%i%kind)                ! { dg-error "not a proper array section" }
+!$acc update self(x%c%len)                 ! { dg-error "not a proper array section" }
+
+! EXPR_VARIABLE
+!$acc enter data copyin(z%re)    ! { dg-error "Unexpected complex-parts designator" }
+!$acc enter data copyin(z%im)    ! { dg-error "Unexpected complex-parts designator" }
+!$acc enter data copyin(zz%re)   ! { dg-error "not a proper array section" }
+                                 ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+!$acc enter data copyin(zz%im)   ! { dg-error "not a proper array section" }
+                                 ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+
+!$acc enter data copyin(x%z%re)  ! { dg-error "Unexpected complex-parts designator" }
+!$acc enter data copyin(x%z%im)  ! { dg-error "Unexpected complex-parts designator" }
+!$acc enter data copyin(x%zz%re) ! { dg-error "not a proper array section" }
+                                 ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+!$acc enter data copyin(x%zz%im) ! { dg-error "not a proper array section" }
+                                 ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+
+!$acc update self(z%re)         ! { dg-error "Unexpected complex-parts designator" }
+!$acc update self(z%im)         ! { dg-error "Unexpected complex-parts designator" }
+!$acc update self(zz%re)        ! { dg-error "not a proper array section" }
+!$acc update self(zz%im)        ! { dg-error "not a proper array section" }
+
+!$acc update self(x%z%re)       ! { dg-error "Unexpected complex-parts designator" }
+!$acc update self(x%z%im)       ! { dg-error "Unexpected complex-parts designator" }
+!$acc update self(x%zz%re)      ! { dg-error "is not a proper array section" }
+!$acc update self(x%zz%im)      ! { dg-error "is not a proper array section" }
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/ref_inquiry.f90 b/gcc/testsuite/gfortran.dg/gomp/ref_inquiry.f90
new file mode 100644
index 00000000000..37461040560
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/ref_inquiry.f90
@@ -0,0 +1,39 @@
+! Check for <var>%re, ...%im, ...%kind, ...%len
+! Cf. also OpenACC's ../goacc/ref_inquiry.f90
+! Cf. also OpenMP spec issue 2661
+implicit none
+type t
+  integer :: i
+  character :: c
+  complex :: z
+  complex :: zz(5)
+end type t
+
+integer :: i
+character(kind=4, len=5) :: c
+complex :: z, zz(5)
+type(t) :: x
+
+print *, is_contiguous(zz(:)%re)
+
+! inquiry function; expr_type != EXPR_VARIABLE:
+!$omp target enter data map(to: i%kind, c%len)     ! { dg-error "not a proper array section" }
+!$omp target enter data map(to: x%i%kind)          ! { dg-error "not a proper array section" }
+!$omp target enter data map(to: x%c%len)           ! { dg-error "not a proper array section" }
+
+! EXPR_VARIABLE
+!$omp target enter data map(to: z%re)    ! { dg-error "Unexpected complex-parts designator" }
+!$omp target enter data map(to: z%im)    ! { dg-error "Unexpected complex-parts designator" }
+!$omp target enter data map(to: zz%re)   ! { dg-error "not a proper array section" }
+                                         ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+!$omp target enter data map(to: zz%im)   ! { dg-error "not a proper array section" }
+                                         ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+
+!$omp target enter data map(to: x%z%re)  ! { dg-error "Unexpected complex-parts designator" }
+!$omp target enter data map(to: x%z%im)  ! { dg-error "Unexpected complex-parts designator" }
+!$omp target enter data map(to: x%zz%re) ! { dg-error "not a proper array section" }
+                                         ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+!$omp target enter data map(to: x%zz%im) ! { dg-error "not a proper array section" }
+                                         ! { dg-error "Array is not contiguous" "" { target *-*-* } .-1 }
+
+end

Reply via email to