[Fortran, Patch, PR125021] Fix symbol confusion
Andre Vehreschild <[email protected]>
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <20260428145752.04e91f62@vepi2> |
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
pr125021_1.patch
(text/x-patch, 5.1 KB)
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