re PR fortran/35721 (ASSOCIATED returns false when strides confusing)
authorTobias Burnus <burnus@net-b.de>
Fri, 28 Mar 2008 13:47:06 +0000 (14:47 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Fri, 28 Mar 2008 13:47:06 +0000 (14:47 +0100)
2008-03-28  Tobias Burnus  <burnus@net-b.de>

        PR fortran/35721
        * intrinsics/associated.c (associated): Ignore different
        stride of pointer vs. target if only one element is referred.

2008-03-28  Tobias Burnus  <burnus@net-b.de>

        PR fortran/35721
        * gfortran.dg/associated_target_2.f90: New.

From-SVN: r133684

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/associated_target_2.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/intrinsics/associated.c

index 8392cfe454cfaf0b90031d33118aa4871f507352..2ac6eb02a205caf2a5ed6ea03373006dd92d7716 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-28  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/35721
+       * gfortran.dg/associated_target_2.f90: New.
+
 2008-03-28  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/19580
diff --git a/gcc/testsuite/gfortran.dg/associated_target_2.f90 b/gcc/testsuite/gfortran.dg/associated_target_2.f90
new file mode 100644 (file)
index 0000000..b1179be
--- /dev/null
@@ -0,0 +1,41 @@
+! { dg-do run }
+!
+! PR fortran/35721
+!
+! ASSOCIATED(ptr, trgt) should return true if
+! the same storage units (in the same order)
+! gfortran was returning false if the strips
+! were different but only one (the same!) element
+! was present.
+!
+! Contributed by Dick Hendrickson
+!
+      program try_mg0028
+      implicit none
+      real  tda2r(2,3)
+
+      call       mg0028(tda2r,  1,  2,  3)
+
+      CONTAINS
+
+      SUBROUTINE MG0028(TDA2R,nf1,nf2,nf3)
+      integer        ::  nf1,nf2,nf3
+      real, target   ::  TDA2R(NF2,NF3)
+      real, pointer  ::  TLA2L(:,:),TLA2L1(:,:)
+      logical LL(4)
+      TLA2L => TDA2R(NF2:NF1:-NF2,NF3:NF1:-NF2)
+      TLA2L1 => TLA2L
+      LL(1) = ASSOCIATED(TLA2L)
+      LL(2) = ASSOCIATED(TLA2L,TLA2L1)
+      LL(3) = ASSOCIATED(TLA2L,TDA2R)
+      LL(4) = ASSOCIATED(TLA2L1,TDA2R(2:2,3:1:-2))  !should be true
+
+      if (any(LL .neqv. (/ .true., .true., .false., .true./))) then
+        print *, LL
+        print *, shape(TLA2L1)
+        print *, shape(TDA2R(2:2,3:1:-2))
+        stop
+      endif
+
+      END SUBROUTINE
+      END PROGRAM
index 892a2456ac7892f7164a8180a1cd6c77bc78c5ff..57ec570681c17098a89abb99020c451845a142a9 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-28  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/35721
+       * intrinsics/associated.c (associated): Ignore different
+       stride of pointer vs. target if only one element is referred.
+
 2008-03-26  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        * io/unix.c (fd_close):  Do not close STDIN.
index 0d32fd7d002b3a4ddd94822b23511a28cc99c121..dc1da1df6f6657c5e8d29aff13586ece0b7492b6 100644 (file)
@@ -48,10 +48,12 @@ associated (const gfc_array_void *pointer, const gfc_array_void *target)
   rank = GFC_DESCRIPTOR_RANK (pointer);
   for (n = 0; n < rank; n++)
     {
-      if (pointer->dim[n].stride != target->dim[n].stride)
+      long diff;
+      diff = pointer->dim[n].ubound - pointer->dim[n].lbound;
+
+      if (diff != (target->dim[n].ubound - target->dim[n].lbound))
         return 0;
-      if ((pointer->dim[n].ubound - pointer->dim[n].lbound)
-          != (target->dim[n].ubound - target->dim[n].lbound))
+      if (pointer->dim[n].stride != target->dim[n].stride && diff != 0)
         return 0;
       if (pointer->dim[n].ubound < pointer->dim[n].lbound)
        return 0;