Hi all,
attached patch fixes a confusion of compiler generated temporary symbols and
Fortran symbols, when the user choose the same name by accident. The generated
symbols are now prefixed using two underscores, which fixes the issue.
Regtests ok on x86_64-pc-linux-gnu / F43. Ok for mainline? Ok for later
backport to gcc-16,15 ?
Regards,
Andre
--
Andre Vehreschild * Email: vehre ad gmx dot de
From f59fa2e963c9b6d2a5ad062add9d605860482ce9 Mon Sep 17 00:00:00 2001
From: Andre Vehreschild <[email protected]>
Date: Tue, 28 Apr 2026 14:30:23 +0200
Subject: [PATCH] Fortran: Use internal names for local symbols.
Prevent collision of Fortran symbols with internally generated symbols by
prefixing internals with two underscores.
PR fortran/125021
gcc/fortran/ChangeLog:
* coarray.cc (check_add_new_comp_handle_array): Prefix internal
symbols by two underscores.
(create_get_callback): Same.
(create_allocated_callback): Same.
(create_send_callback): Same.
gcc/testsuite/ChangeLog:
* gfortran.dg/coarray/pr125021.f90: New test.
---
gcc/fortran/coarray.cc | 23 ++++++++++---------
.../gfortran.dg/coarray/pr125021.f90 | 21 +++++++++++++++++
2 files changed, 33 insertions(+), 11 deletions(-)
create mode 100644 gcc/testsuite/gfortran.dg/coarray/pr125021.f90
diff --git a/gcc/fortran/coarray.cc b/gcc/fortran/coarray.cc
index 18f4c29c1057..dbca4a152de9 100644
--- a/gcc/fortran/coarray.cc
+++ b/gcc/fortran/coarray.cc
@@ -620,7 +620,7 @@ check_add_new_comp_handle_array (gfc_expr *e, gfc_symbol *type,
c->expr2->ref->u.ar.codimen = 1;
c->expr2->ref->u.ar.dimen_type[0] = DIMEN_ELEMENT;
caller_image
- = gfc_find_symtree_in_proc ("caller_image", add_data->ns);
+ = gfc_find_symtree_in_proc ("__caller_image", add_data->ns);
gcc_assert (caller_image);
c->expr2->ref->u.ar.start[0] = gfc_get_variable_expr (caller_image);
c->expr2->ref->u.ar.start[0]->where = e->where;
@@ -866,16 +866,16 @@ create_get_callback (gfc_expr *expr)
(*argptr)->sym = nsym; \
argptr = &(*argptr)->next
- name = xasprintf ("add_data_%s_%s_%d", mname, tname, caf_sym_cnt);
+ name = xasprintf ("__add_data_%s_%s_%d", mname, tname, caf_sym_cnt);
ADD_ARG (name, get_data, BT_DERIVED, 0, INTENT_IN);
gfc_commit_symbol (get_data);
free (name);
- ADD_ARG ("caller_image", caller_image, BT_INTEGER, gfc_default_integer_kind,
+ ADD_ARG ("__caller_image", caller_image, BT_INTEGER, gfc_default_integer_kind,
INTENT_IN);
gfc_commit_symbol (caller_image);
- ADD_ARG ("buffer", buffer, expr->ts.type, expr->ts.kind, INTENT_INOUT);
+ ADD_ARG ("__buffer", buffer, expr->ts.type, expr->ts.kind, INTENT_INOUT);
buffer->ts = expr->ts;
if (expr_rank)
{
@@ -915,7 +915,7 @@ create_get_callback (gfc_expr *expr)
}
gfc_commit_symbol (buffer);
- ADD_ARG ("free_buffer", free_buffer, BT_LOGICAL, gfc_default_logical_kind,
+ ADD_ARG ("__free_buffer", free_buffer, BT_LOGICAL, gfc_default_logical_kind,
INTENT_OUT);
gfc_commit_symbol (free_buffer);
@@ -1115,15 +1115,16 @@ create_allocated_callback (gfc_expr *expr)
(*argptr)->sym = nsym; \
argptr = &(*argptr)->next
- name = xasprintf ("add_data_%s_%s_%d", mname, tname, ++caf_sym_cnt);
+ name = xasprintf ("__add_data_%s_%s_%d", mname, tname, ++caf_sym_cnt);
ADD_ARG (name, add_data, BT_DERIVED, 0, INTENT_IN);
gfc_commit_symbol (add_data);
free (name);
- ADD_ARG ("caller_image", caller_image, BT_INTEGER, gfc_default_integer_kind,
+ ADD_ARG ("__caller_image", caller_image, BT_INTEGER, gfc_default_integer_kind,
INTENT_IN);
gfc_commit_symbol (caller_image);
- ADD_ARG ("result", result, BT_LOGICAL, gfc_default_logical_kind, INTENT_OUT);
+ ADD_ARG ("__result", result, BT_LOGICAL, gfc_default_logical_kind,
+ INTENT_OUT);
gfc_commit_symbol (result);
// ADD_ARG (expr->symtree->name, base, BT_VOID, INTENT_IN);
@@ -1260,12 +1261,12 @@ create_send_callback (gfc_expr *expr, gfc_expr *rhs)
(*argptr)->sym = nsym; \
argptr = &(*argptr)->next
- name = xasprintf ("add_send_data_%s_%s_%d", mname, tname, caf_sym_cnt);
+ name = xasprintf ("__add_send_data_%s_%s_%d", mname, tname, caf_sym_cnt);
ADD_ARG (name, send_data, BT_DERIVED, 0, INTENT_IN);
gfc_commit_symbol (send_data);
free (name);
- ADD_ARG ("caller_image", caller_image, BT_INTEGER, gfc_default_integer_kind,
+ ADD_ARG ("__caller_image", caller_image, BT_INTEGER, gfc_default_integer_kind,
INTENT_IN);
gfc_commit_symbol (caller_image);
@@ -1279,7 +1280,7 @@ create_send_callback (gfc_expr *expr, gfc_expr *rhs)
argptr = &(*argptr)->next;
gfc_commit_symbol (base);
- ADD_ARG ("buffer", buffer, rhs->ts.type, rhs->ts.kind, INTENT_IN);
+ ADD_ARG ("__buffer", buffer, rhs->ts.type, rhs->ts.kind, INTENT_IN);
buffer->ts = rhs->ts;
if (rhs->rank)
{
diff --git a/gcc/testsuite/gfortran.dg/coarray/pr125021.f90 b/gcc/testsuite/gfortran.dg/coarray/pr125021.f90
new file mode 100644
index 000000000000..db6285f3e8ca
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/pr125021.f90
@@ -0,0 +1,21 @@
+!{ dg-do run }
+
+! Contributed by Neil Carlson <[email protected]>
+! Test for PR fortran/125021
+
+type box
+ integer, allocatable :: data(:)
+end type
+type(box), allocatable :: buffer[:]
+
+integer :: i, n
+
+allocate(buffer[*])
+allocate(buffer%data(1), source=this_image())
+sync all
+
+i = 1 + modulo(this_image(), num_images())
+n = buffer[i]%data(1)
+if (n /= i ) error stop
+end
+
--
2.54.0