https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120505
--- Comment #2 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Paul-Antoine Arras <[email protected]>: https://gcc.gnu.org/g:99cfdcee2fe9b0f5230f17fd3226825259171138 commit r16-7646-g99cfdcee2fe9b0f5230f17fd3226825259171138 Author: Paul-Antoine Arras <[email protected]> Date: Fri Feb 20 14:21:29 2026 +0100 OpenMP/Fortran: Map intermediate array descriptors [PR120505] Consider the following OMP directive, assuming tiles is allocatable: !$omp target enter data & !$omp map(to: chunk%tiles(1)%field%density0) & !$omp map(to: chunk%left_rcv_buffer) libgomp reports an illegal memory access error at runtime. This is because density0 is referenced through tiles, which requires its descriptor to be mapped along its content. This patch ensures that all such intervening allocatables in a reference chain are properly mapped. For the above example, the frontend has to create the following three additional map clauses: (1) map (alloc: *(struct tile_type[0:] * restrict) chunk.tiles.data [len: 0]) (2) map (to: chunk.tiles [pointer set, len: 64]) (3) map (attach_detach: (struct tile_type[0:] * restrict) chunk.tiles.data [bias: -1]) (1) is required by the gimplifier for attaching but will be removed at the end of the pass; the inner component is explicitly to-mapped elsewhere. (2) ensures that the array descriptor will be available at runtime to compute offsets and strides in various dimensions. The gimplifier will turn (3) into a regular attach of the data pointer and compute the bias. PR fortran/120505 gcc/fortran/ChangeLog: * trans-openmp.cc (gfc_map_array_descriptor): New function. (gfc_trans_omp_clauses): Emit map clauses for intermediate array descriptors. gcc/ChangeLog: * gimplify.cc (omp_mapped_by_containing_struct): Handle Fortran array descriptors. (omp_build_struct_sibling_lists): Allow attach_detach bias to be adjusted on non-target regions. (gimplify_adjust_omp_clauses): Remove GIMPLE-only nodes. * tree-pretty-print.cc (dump_omp_clause): Handle OMP_CLAUSE_MAP_SIZE_NEEDS_ADJUSTMENT and OMP_CLAUSE_MAP_GIMPLE_ONLY. * tree.h (OMP_CLAUSE_MAP_SIZE_NEEDS_ADJUSTMENT, OMP_CLAUSE_MAP_GIMPLE_ONLY): Define. libgomp/ChangeLog: * testsuite/libgomp.fortran/map-subarray-11.f90: New test. * testsuite/libgomp.fortran/map-subarray-13.f90: New test. * testsuite/libgomp.fortran/map-subarray-14.f90: New test. * testsuite/libgomp.fortran/map-subarray-15.f90: New test. * testsuite/libgomp.fortran/map-subarray-16.f90: New test. * testsuite/libgomp.fortran/map-alloc-present-2.f90: New file. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/map-subarray-3.f90: New test. * gfortran.dg/gomp/map-subarray-5.f90: New test.
