re PR fortran/32315 (DATA with implied-do: Bounds checks missing [regression vs....
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 5 Feb 2008 11:16:33 +0000 (11:16 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 5 Feb 2008 11:16:33 +0000 (11:16 +0000)
2008-02-05  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/32315
* data.c (gfc_assign_data_value): Add bounds check for array
references.

2008-02-05  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/32315
* gfortran.dg/data_bounds_1.f90: New test.

From-SVN: r132113

gcc/fortran/ChangeLog
gcc/fortran/data.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/data_bounds_1.f90 [new file with mode: 0644]

index c21720efd1db2c5299ddd85c35b07232c4508685..97a1a179f2d5a92f2616c6d0e5821d9ec6393f04 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/32315
+       * data.c (gfc_assign_data_value): Add bounds check for array
+       references.
+
 2008-02-04  Daniel Franke  <franke.daniel@gmail.com>
 
        * resolve.c (resolve_where): Fix typo.
index 41dc85f8fa06d9d25424a26e39a6246a0252f12b..10fcd48676e4af274dd980495dfdb2cd455c22e6 100644 (file)
@@ -311,6 +311,27 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index)
          else
            mpz_set (offset, index);
 
+         /* Check the bounds.  */
+         if (mpz_cmp_si (offset, 0) < 0)
+           {
+             gfc_error ("Data element below array lower bound at %L",
+                        &lvalue->where);
+             return FAILURE;
+           }
+         else
+           {
+             mpz_t size;
+             if (spec_size (ref->u.ar.as, &size) == SUCCESS
+                  && mpz_cmp (offset, size) >= 0)
+               {
+                 mpz_clear (size);
+                 gfc_error ("Data element above array upper bound at %L",
+                            &lvalue->where);
+                 return FAILURE;
+               }
+             mpz_clear (size);
+           }
+
          /* Splay tree containing offset and gfc_constructor.  */
          spt = expr->con_by_offset;
 
index cc6a362b1102be91dfdaceebd49078f87eb7fa35..4c1b912ab935baece88ab745ae8c661d253a9711 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/32315
+       * gfortran.dg/data_bounds_1.f90: New test.
+
 2008-02-04  Diego Novillo  <dnovillo@google.com>
 
        http://gcc.gnu.org/ml/gcc-patches/2008-02/msg00110.html
diff --git a/gcc/testsuite/gfortran.dg/data_bounds_1.f90 b/gcc/testsuite/gfortran.dg/data_bounds_1.f90
new file mode 100644 (file)
index 0000000..b20aa41
--- /dev/null
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! Checks the fix for PR32315, in which the bounds checks below were not being done.
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+!
+program chkdata
+    character(len=20), dimension(4) :: string
+    character(len=20), dimension(0:1,3:4) :: string2
+
+    data (string(i) ,i = 4, 5) /'D', 'E'/ ! { dg-error "above array upper bound" }
+    data (string(i) ,i = 0, 1) /'A', 'B'/ ! { dg-error "below array lower bound" }
+    data (string(i) ,i = 1, 4) /'A', 'B', 'C', 'D'/
+
+    data ((string2(i, j) ,i = 1, 2), j = 3, 4) /'A', 'B', 'C', 'D'/ ! { dg-error "above array upper bound" }
+    data ((string2(i, j) ,i = 0, 1), j = 2, 3) /'A', 'B', 'C', 'D'/ ! { dg-error "below array lower bound" }
+    data ((string2(i, j) ,i = 0, 1), j = 3, 4) /'A', 'B', 'C', 'D'/
+end program chkdata