CC fortran as it is a Fortran patch. Cf. for the overview
https://gcc.gnu.org/pipermail/gcc-patches/2026-June/719430.html
and for this patch
https://gcc.gnu.org/pipermail/gcc-patches/2025-July/689064.html
@Sandra - please fix the u3 issue before committing the 4/11 and this 5/11
patch, cf. below.
Sandra Loosemore wrote:
This adds Fortran support for iterators in 'to' and 'from' clauses in the
'target update' OpenMP directive.
--- a/gcc/fortran/dump-parse-tree.cc
+++ b/gcc/fortran/dump-parse-tree.cc
@@ -1486,7 +1486,8 @@ show_omp_namelist (int list_type, gfc_omp_namelist *n)
{
gfc_current_ns = ns_curr;
if (list_type == OMP_LIST_AFFINITY || list_type == OMP_LIST_DEPEND
- || list_type == OMP_LIST_MAP)
+ || list_type == OMP_LIST_MAP
+ || list_type == OMP_LIST_TO || list_type == OMP_LIST_FROM)
{
...
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -6342,7 +6342,8 @@ void
gfc_free_omp_namelist (gfc_omp_namelist *name, enum gfc_omp_list_type list)
{
bool free_ns = (list == OMP_LIST_AFFINITY || list == OMP_LIST_DEPEND
- || list == OMP_LIST_MAP);
+ || list == OMP_LIST_MAP
+ || list == OMP_LIST_TO || list == OMP_LIST_FROM)
bool free_align_allocator = (list == OMP_LIST_ALLOCATE);
bool free_mem_traits_space = (list == OMP_LIST_USES_ALLOCATORS);
bool free_init = (list == OMP_LIST_INIT);
bool free_mapper = (list == OMP_LIST_MAP);
This part actually clashes with 'declare mapper' for the not
merged bits. (I have a pending patch (snipped of Julian's patch set),
that I kept wanting to review this week. The problem is:
if (free_ns)
gfc_free_namespace (name->u2.ns);
...
else if (free_mapper && name->u2.udm)
free (name->u2.udm);
and gfc_omp_namelist's
union
{
struct gfc_omp_namelist_udr *udr;
struct gfc_omp_namelist_udm *udm; /// <<<<<<<<<<<<<<<
gfc_namespace *ns; /// <<<<<<<<<<<<<<<
gfc_expr *allocator;
struct gfc_symbol *traits_sym;
struct gfc_omp_namelist *duplicate_of;
char *init_interop;
} u2;
which actually also affects patch 4/5 that added:
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -6341,7 +6341,8 @@ gfc_free_namelist (gfc_namelist *name)
void
gfc_free_omp_namelist (gfc_omp_namelist *name, enum gfc_omp_list_type list)
{
- bool free_ns = (list == OMP_LIST_AFFINITY || list == OMP_LIST_DEPEND);
+ bool free_ns = (list == OMP_LIST_AFFINITY || list == OMP_LIST_DEPEND
+ || list == OMP_LIST_MAP);
and that I missed there :-/
I am not sure what's the best way - by possibly to do what Kwok
did in commit (here: OG14):
2afb6281a5a openmp, fortran: Move udm field of gfc_omp_namelist into a new
union
* * *
Thus: Could you do so? On mainline, it currently only affects:
gcc/fortran/gfortran.h: struct gfc_omp_namelist_udm udm;
gcc/fortran/match.cc: { } /* For now, u2.udm is not a pointer. */
gcc/fortran/openmp.cc: n->u2.udm.udm = udm;
As Kwok's change reduced to those three cases is trivial,
please just commit it.
Once done, I re-base my next almost ready bit of the Fortran
declare-mapper patches.
* * *
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -5270,12 +5270,40 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
case OMP_LIST_TO:
case OMP_LIST_FROM:
case OMP_LIST_CACHE:
+ iterator = NULL_TREE;
+ prev = NULL;
+ prev_clauses = omp_clauses;
for (; n != NULL; n = n->next)
{
if (!n->sym->attr.referenced
&& n->sym->attr.flavor != FL_PARAMETER)
continue;
Just looking at the interdiff, I think the last condition (not
touched by this patch) looks wrong. I think it should be:
!n->sym->attr.referenced || n->sym->attr.flavor == FL_PARAMETER
It seems to be wrong that parameters are still processed, when they
shouldn't :-/
That's
r16-2213-g451b6dbf475959 Fortran/OpenACC: Permit PARAMETER as 'var' in clauses
(+ ignore)
Side remark: There is also some more recent OpenMP wording regarding
const/constexpr which go in the same direction for mapping.
I guess it is on me to fix this ...
* * *
LGTM - after the 'u3' fix.
Thanks for the patch!
Tobias
PS: And I shall not forget to look at this condition issue ...