https://gcc.gnu.org/g:eff7e72815ada5c70c974d42f6a419e29a03eb27

commit r15-5701-geff7e72815ada5c70c974d42f6a419e29a03eb27
Author: Harald Anlauf <anl...@gmx.de>
Date:   Mon Nov 25 22:55:10 2024 +0100

    Fortran: passing inquiry ref of complex array to assumed rank dummy 
[PR117774]
    
            PR fortran/117774
    
    gcc/fortran/ChangeLog:
    
            * trans-expr.cc (gfc_conv_procedure_call): When passing an array
            to an assumed-rank dummy, terminate search for array reference of
            actual argument before an inquiry reference (e.g. INQUIRY_RE,
            INQUIRY_IM) so that bounds update works properly.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/assumed_rank_25.f90: New test.

Diff:
---
 gcc/fortran/trans-expr.cc                     |  5 ++-
 gcc/testsuite/gfortran.dg/assumed_rank_25.f90 | 51 +++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index bc1d5a87307d..41d06a99f757 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -7398,7 +7398,10 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
                  /* Change AR_FULL to a (:,:,:) ref to force bounds update. */
                  gfc_ref *ref;
                  for (ref = e->ref; ref->next; ref = ref->next)
-                   ;
+                   {
+                     if (ref->next->type == REF_INQUIRY)
+                       break;
+                   };
                  if (ref->u.ar.type == AR_FULL
                      && ref->u.ar.as->type != AS_ASSUMED_SIZE)
                    ref->u.ar.type = AR_SECTION;
diff --git a/gcc/testsuite/gfortran.dg/assumed_rank_25.f90 
b/gcc/testsuite/gfortran.dg/assumed_rank_25.f90
new file mode 100644
index 000000000000..fce75aa519f3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assumed_rank_25.f90
@@ -0,0 +1,51 @@
+! { dg-do run }
+! { dg-additional-options "-fcheck=bounds" }
+!
+! PR fortran/117774 - passing imaginary part of complex array to assumed rank 
dummy
+
+module mod
+  implicit none
+contains
+  subroutine foo(r, s1, s2)
+    real, intent(in) :: r(..) ! ASSUMED-RANK DUMMY
+    real, intent(in), optional :: s1(:)
+    real, intent(in), optional :: s2(:,:)
+    select rank (r)
+    rank (1)
+!     print *, r
+      if (present (s1)) then
+         if (any (r /= s1)) stop 1
+      end if
+    rank (2)
+!     print *, r
+      if (present (s2)) then
+         if (any (r /= s2)) stop 2
+      end if
+    end select
+  end subroutine
+end module
+
+program p
+  use mod
+  implicit none
+  real    :: re1(3),   im1(3)
+  real    :: re2(3,7), im2(3,7)
+  complex :: z1(3),    z2 (3,7)
+  integer :: i, j
+
+  re1 = [(2*i-1,i=1,size(re1))]
+  im1 = [(2*i  ,i=1,size(im1))]
+  z1  = cmplx (re1,im1)
+  call foo (z1    % re, re1)
+  call foo (z1    % im, im1)
+  call foo (z1(2:)% re, re1(2:))
+  call foo (z1(2:)% im, im1(2:))
+
+  re2 = reshape ([ (re1+10*j, j=1,7)], shape (re2))
+  im2 = reshape ([ (im1+10*j, j=1,7)], shape (im2))
+  z2  = cmplx (re2,im2)
+  call foo (z2       % re, s2=re2)
+  call foo (z2       % im, s2=im2)
+  call foo (z2(2:,3:)% re, s2=re2(2:,3:))
+  call foo (z2(2:,3:)% im, s2=im2(2:,3:))
+end

Reply via email to