OSDN Git Service

2006-09-10 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Sep 2006 17:13:29 +0000 (17:13 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Sep 2006 17:13:29 +0000 (17:13 +0000)
PR fortran/28923
expr.c (find_array_section): Only use the array lower and upper
bounds for the start and end of the sections, where the expr is
NULL.

2006-09-10  Paul Thomas  <pault@gcc.gnu.org>

PR libfortran/28923
gfortran.dg/array_initializer_2.f90: Fill in missing index start value.
gfortran.dg/array_initializer_3.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116815 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/array_initializer_2.f90
gcc/testsuite/gfortran.dg/array_initializer_3.f90 [new file with mode: 0644]

index 6fbec93..5b62215 100644 (file)
@@ -1,4 +1,11 @@
-2006-09-09  Paul Thomas <pault@gcc.gnu.org>
+2006-09-10  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/28923
+       expr.c (find_array_section): Only use the array lower and upper
+       bounds for the start and end of the sections, where the expr is
+       NULL.
+
+2006-09-10  Paul Thomas <pault@gcc.gnu.org>
 
        PR fortran/28914
        * trans-array.c (gfc_trans_array_constructor_value): Create a temporary
 
        PR fortran/28914
        * trans-array.c (gfc_trans_array_constructor_value): Create a temporary
index b1f064d..5eef939 100644 (file)
@@ -1090,24 +1090,15 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
       if (begin)
          mpz_set (start[d], begin->value.integer);
       else
       if (begin)
          mpz_set (start[d], begin->value.integer);
       else
-       {
-         if (mpz_cmp_si (stride[d], 0) < 0)
-           mpz_set (start[d], upper->value.integer);
-         else
-           mpz_set (start[d], lower->value.integer);
-       }
+       mpz_set (start[d], lower->value.integer);
+
       mpz_set (ctr[d], start[d]);
 
       /* Obtain the end value for the index.  */
       if (finish)
         mpz_set (end[d], finish->value.integer);
       else
       mpz_set (ctr[d], start[d]);
 
       /* Obtain the end value for the index.  */
       if (finish)
         mpz_set (end[d], finish->value.integer);
       else
-       {
-         if (mpz_cmp_si (stride[d], 0) < 0)
-           mpz_set (end[d], lower->value.integer);
-         else
-           mpz_set (end[d], upper->value.integer);
-       }
+       mpz_set (end[d], upper->value.integer);
 
       /* Separate 'if' because elements sometimes arrive with
         non-null end.  */
 
       /* Separate 'if' because elements sometimes arrive with
         non-null end.  */
index 3d877ed..152d5cf 100644 (file)
@@ -1,3 +1,9 @@
+2006-09-09  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR libfortran/28923
+       gfortran.dg/array_initializer_2.f90: Fill in missing index start value.
+       gfortran.dg/array_initializer_3.f90: New test.
+
 2006-09-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/28914
 2006-09-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/28914
index a1a5bdf..a7cd3a7 100644 (file)
@@ -8,7 +8,7 @@
   integer, dimension(3), parameter :: a=(/1,2,3/)
   integer, dimension(3), parameter :: b=(/a(:)/)
   integer, dimension(3,3), parameter :: c=reshape ((/(i, i = 1,9)/),(/3,3/))
   integer, dimension(3), parameter :: a=(/1,2,3/)
   integer, dimension(3), parameter :: b=(/a(:)/)
   integer, dimension(3,3), parameter :: c=reshape ((/(i, i = 1,9)/),(/3,3/))
-  integer, dimension(2,3), parameter :: d=reshape ((/c(:2:-1,:)/),(/2,3/))
+  integer, dimension(2,3), parameter :: d=reshape ((/c(3:2:-1,:)/),(/2,3/))
   integer, dimension(3,3), parameter :: e=reshape ((/a(:),a(:)+3,a(:)+6/),(/3,3/))
   integer, dimension(2,3), parameter :: f=reshape ((/c(2:1:-1,:)/),(/2,3/))
   if (any (b .ne. (/1,2,3/))) call abort ()
   integer, dimension(3,3), parameter :: e=reshape ((/a(:),a(:)+3,a(:)+6/),(/3,3/))
   integer, dimension(2,3), parameter :: f=reshape ((/c(2:1:-1,:)/),(/2,3/))
   if (any (b .ne. (/1,2,3/))) call abort ()
diff --git a/gcc/testsuite/gfortran.dg/array_initializer_3.f90 b/gcc/testsuite/gfortran.dg/array_initializer_3.f90
new file mode 100644 (file)
index 0000000..fd35875
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do compile }
+! Tests the fix for PR28923 in which initializer array constructors with
+! a missing initial array index and negative stride would be incorrectly
+! interpreted.
+!
+! Contributed by Dominique d'Humieres  <dominiq@lps.ens.fr>
+!
+real, dimension(3,3), parameter :: a=reshape ((/(i, i = 1,9)/),(/3,3/))
+real, dimension(2,3) :: b=a(:2:-1,:)  ! { dg-error "different shape for Array assignment" }
+real, dimension(2,3) :: c=a(3:2:-1,:)
+print *, b
+print *, c
+end
+