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
