diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2025-06-27 15:31:21 +0200 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2025-07-01 13:02:13 +0200 |
commit | ee31ab9b1950b7f47f030bda231ace34d187ae26 (patch) | |
tree | 6b5babd37aadc245c196ad5b67603dadb771fe17 | |
parent | d0561362e90a97a89358d8ca792208555cb3f87d (diff) | |
download | gcc-ee31ab9b1950b7f47f030bda231ace34d187ae26.zip gcc-ee31ab9b1950b7f47f030bda231ace34d187ae26.tar.gz gcc-ee31ab9b1950b7f47f030bda231ace34d187ae26.tar.bz2 |
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.
-rw-r--r-- | gcc/fortran/coarray.cc | 4 | ||||
-rw-r--r-- | 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 2f067f8..6914697 100644 --- a/gcc/fortran/coarray.cc +++ b/gcc/fortran/coarray.cc @@ -503,7 +503,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; @@ -566,7 +566,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 0000000..0663970 --- /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 |