https://gcc.gnu.org/g:67452737d8e6d2629104ac811eaf6ec8c1790614

commit r15-9935-g67452737d8e6d2629104ac811eaf6ec8c1790614
Author: Andre Vehreschild <ve...@gcc.gnu.org>
Date:   Fri Jun 27 15:31:21 2025 +0200

    Fortran: Ensure arguments in coarray call get unique components in add_data 
[PR120847]
    
            PR fortran/120847
    
    gcc/fortran/ChangeLog:
    
            * coarray.cc (check_add_new_comp_handle_array): Make the count
            of components static to be able to create more than one.  Create
            an array component only for array expressions.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/coarray/coindexed_7.f90: New test.
    
    (cherry picked from commit ee31ab9b1950b7f47f030bda231ace34d187ae26)

Diff:
---
 gcc/fortran/coarray.cc                            |  4 ++--
 gcc/testsuite/gfortran.dg/coarray/coindexed_7.f90 | 24 +++++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/coarray.cc b/gcc/fortran/coarray.cc
index 70583254d0d8..a2cfdc0fb52c 100644
--- a/gcc/fortran/coarray.cc
+++ b/gcc/fortran/coarray.cc
@@ -498,7 +498,7 @@ check_add_new_comp_handle_array (gfc_expr *e, gfc_symbol 
*type,
                                 gfc_symbol *add_data)
 {
   gfc_component *comp;
-  int cnt = -1;
+  static int cnt = -1;
   gfc_symtree *caller_image;
   gfc_code *pre_code = caf_accessor_prepend;
   bool static_array_or_scalar = true;
@@ -561,7 +561,7 @@ check_add_new_comp_handle_array (gfc_expr *e, gfc_symbol 
*type,
   else
     {
       comp->initializer = gfc_copy_expr (e);
-      if (e_attr.dimension)
+      if (e_attr.dimension && e->rank)
        {
          comp->attr.dimension = 1;
          comp->as = get_arrayspec_from_expr (e);
diff --git a/gcc/testsuite/gfortran.dg/coarray/coindexed_7.f90 
b/gcc/testsuite/gfortran.dg/coarray/coindexed_7.f90
new file mode 100644
index 000000000000..066397024f47
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/coindexed_7.f90
@@ -0,0 +1,24 @@
+!{ dg-do compile }
+
+! Check PR120847 is fixed.
+
+program p
+  implicit none
+
+  type T
+    integer, allocatable :: i(:, :) [:]
+  end type T
+
+  type(T) :: o
+  integer, allocatable :: c[:]
+  integer :: i
+
+  c = 7
+
+  allocate(o%i(4, 5)[*], source=6)
+
+  do i = 1, 4
+    c = o%i(mod(i, 2), mod(i, 3))[1]
+  end do
+
+end program p

Reply via email to