Looks as if today is the day of many small commits...

I have run into an ICE for a small declare mapper testcase, fixed
by the attached code.

This one uses strides in the declare mapper, which is currently
unsupported in GCC.

There is a valid and an invalid use of strided in the testcase;
as the OG15 branch does not diagnose the invalid use, I added
also a C/C++ testcase as reminder to fix this, when we implement
strided support.

Committed as r17-1745-g3219ad7078f304.

Tobias
commit 3219ad7078f30468ed4cc468e2824b6345b02531
Author: Tobias Burnus <[email protected]>
Date:   Mon Jun 22 12:58:09 2026 +0200

    OpenMP: declare mapper - avoid ICE in Fortran, add Fortran/C/C++ testcases
    
    Declare mapper with strided is not yet supported and is reject at parse
    time. For non-contiguous memory, Fortran gave an ICE, which this commit
    fixes.
    
    Additionally, once implemented, the strided use needs to be diagosed
    when used in 'target {,{enter,exit}}' but is fine for 'target update';
    the added testcases should make it easier not to forgot to check this,
    once strided is added.
    
    gcc/fortran/ChangeLog:
    
            * openmp.cc (resolve_omp_clauses): Avoid ICE when called
            by gfc_resolve_omp_udm.
    
    gcc/testsuite/ChangeLog:
    
            * c-c++-common/gomp/declare-mapper-2.c: New test.
            * gfortran.dg/gomp/declare-mapper-8.f90: New test.
---
 gcc/fortran/openmp.cc                              |  4 +++-
 gcc/testsuite/c-c++-common/gomp/declare-mapper-2.c | 25 ++++++++++++++++++++++
 .../gfortran.dg/gomp/declare-mapper-8.f90          | 22 +++++++++++++++++++
 3 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 33e21d77aba..fbf2459de57 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -10383,7 +10383,9 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
 			int i;
 			gfc_array_ref *ar = &lastslice->u.ar;
 			for (i = 0; i < ar->dimen; i++)
-			  if (ar->stride[i] && code->op != EXEC_OACC_UPDATE)
+			  if (ar->stride[i]
+			      && code
+			      && code->op != EXEC_OACC_UPDATE)
 			    {
 			      gfc_error ("Stride should not be specified for "
 					 "array section in %s clause at %L",
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-mapper-2.c b/gcc/testsuite/c-c++-common/gomp/declare-mapper-2.c
new file mode 100644
index 00000000000..85f361e24fd
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/declare-mapper-2.c
@@ -0,0 +1,25 @@
+/* Eventually: Check that strided use of 'declare mapper' is rejected for
+   'target enter data' but accepted for 'target update'
+
+   However, it currently fails already for parsing. */
+
+struct t
+{
+  int n;
+  int *p;
+};
+
+#pragma omp declare mapper(my : struct t s) map(to: s, s.p[0:s.n:2])
+// { dg-error "65: expected '\\\]' before ':' token" "" { target c } .-1 }
+// { dg-error "65: expected '\\]' before ':' token" "" { target c++ } .-2 }
+// { dg-error "65: expected '\\)' before ':' token" "" { target c++ } .-3 }
+
+// FIXME: ensure that [:s.n:2] also parses in C++26 despite [: ... :] syntax.
+// FIXME: remove ifndef:
+#ifndef __cplusplus  // Silence some more errors until strided is implemented
+void f() {
+  struct t v;
+  #pragma omp target enter data map(mapper(my), to: v)
+  #pragma omp target update to(mapper(my): v)
+}
+#endif
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-mapper-8.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-mapper-8.f90
new file mode 100644
index 00000000000..92d6a678cfd
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-mapper-8.f90
@@ -0,0 +1,22 @@
+!
+! Eventually: Check that strided use of 'declare mapper' is rejected for
+! 'target enter data' but accepted for 'target update'
+!
+! However, it currently fails already for parsing, but it should at least not ICE
+!
+module m
+implicit none
+type t
+  integer :: n
+  integer,pointer :: p(:)
+end type t
+
+!$omp declare mapper(my : t :: s) map(to: s, s%p(:s%n:2))
+contains
+
+subroutine f()
+  type(t) v
+  !$omp target enter data map(mapper(my), to: v) ! FIXME/TODO: This line should get rejected
+  !$omp target update to(mapper(my): v)  ! { dg-error "Syntax error in OpenMP variable list" }
+end
+end

Reply via email to